继承


extends:译为扩展、延伸之意。在java中,继承是在面向对象的基础上提出的概念。面向对象讲的是将同类型事物抽象出来,然后封装成类。类相当于是一种模板,根据这种模板产生具体的实例对象,而实例对象则负责完成具体的业务逻辑。在类型的抽象过程中,有很多属性和方法是通用的,即很多类都具有相同的部分。所以我们需要将这些相同的部分抽离出来,作为基类,子类只要继承了基类,则自动拥有了那些公共的属性。这样就可以减少代码重复,使代码更加简洁,逻辑更加清晰。

java中所有的类都默认继承自Object类,Object类中包含equals和toString()方法。equals默认比较引用是否相等,而toString默认打印了对象的hashcode信息。通常在使用时我们都会重写这两个方法。如果查看源码会发现不止这两个方法,会有很多native方法。native方法查看不到具体的方法实现,native方法通常是其他语言编写的,使其效率更高。

java默认为单继承,一个子类只能继承一个父类。但可以是多实现,即一个子类可以实现多个接口。在java8中新增了默认方法。使得在接口中也可以有方法实现,使其可以完成多继承的功能。

public interface Vehicle {default void print(){System.out.println("我是一辆车!");}
}

子类继承父类后,就已经包含了父类的所有属性和方法。类中使用this关键字来表示对自身的引用,之前也有提到,我们代码编写时定义的类其实只是一个模板,这个模板定义了这个类的所有元信息,通过这些信息我们就可以实例化出对象,而Class信息在类加载过程中,会被存储到内存模型中的方法区中,也是我们使用反射时获取的数据来源。这里的this并不是指我们编写的这个类,而是具体产生的实例对象。我们知道java中new产生的对象都分配在堆上,所以this其实就是指向这个对象实例在堆上的内存地址。我们声明了一个类模板信息,但是可以new出很多个对象,this在不同的对象实例中就会有不同的值,而我们定义类时使用的关键字更像是一个占位符。

继承了父类后,不仅有this关键字指向自身,也会有super关键字指向父类。刚才分析到this是指向堆内存的一个引用,同理super也是这样的一个引用。由此可以说明,在实例化子类的同时,也实例化了一个父类对象。下面是类初始化的顺序:

  1. 父类静态成员和静态初始化块
  2. 子类静态成员和静态初始化块
  3. 父类实例成员和实例初始化块
  4. 父类构造方法
  5. 子类实例成员和实例初始化块
  6. 子类构造方法

所以子类拥有了一个父类的引用,所以我们可以通过这个引用拿到父类的所有信息。所以继承虽然名称叫做继承,但其实可以看做是使用了组合的方式,将父类引用作为子类的一个属性,从而实现了复用和扩展。

如果使用static修饰的方法中,并不存在this和super的引用。因为static修饰的方法属于类的基本信息,把类信息作为模板理解,模板是记录了类的元数据,所有类在实例化的时候都是通过这些元数据进行初始化。所以只要模板中声明了,那么所有的对象实例中自然也就包含了这些函数。并且Class信息存储在内存模型的方法区中,属于线程共享的区域。所以我们可以直接访问方法区拿到static修饰的类信息,没有必要通过引用去堆中找到对应的内存块,然后拿到对应的数据或者方法,因为他们都是一样的。更加没有必要分辨this还是super,因为这些基本信息在类模板中早已经确定了。

谈到了继承就会有两个概念需要区分:重载与重写。子类得到父类的所有数据后,如果需要对其功能进行加强或者修改,就需要重新编写这个方法。但其方法签名(包括方法名称、参数类型、参数个数,返回值不属于方法签名的一部分)不改变,仅仅是修改方法体。这时候子类中就拥有了两个方法签名完全相同的方法,一个来自父类,一个是自己重新定义的。在使用时,来自父类的方法会隐藏起来,只有子类重新定义的方法才会生效。这里就涉及到了多态的相关原理。所以重写指的是重新编写新方法替换掉继承下来的方法。而重载其实和继承并没有任何关系,只是因为名称相近所以在这里进行区分。有时候同一件事情会有多种解决方案,但是解决这个事情的过程我们却只有一个命名。比如在超市结账,买一件商品叫做结账,买两件商品也叫结账,买不同种类的商品还是叫结账。在程序中的体现就是为了满足各种情况,我们编写了各自不同的处理方法,但是它们的名称相同,但方法签名不同,也就是参数类型,参数个数不同。这些名称相同的方法就构成了重载。因为名称相同所以可能对我们编程人员可能造成困扰,而在计算机眼里,并不是通过名称来区分方法的不同,而是通过方法签名,所以这些名称相同的方法,在处理过程中自动就被识别成了不同的方法,根本不会有任何的阻碍。所以为什么要把不同的方法命名成一样的名字呢?除了更加符合现实中的习惯,感觉没有任何意义。

深入理解java继承相关推荐

  1. java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...

    一个简单的例子理解java继承.成员函数重写.类型转换 1.继承简介 举一个简单的例子:笔分为很多种,比如毛笔.钢笔.圆珠笔等等,这些笔都有一些相同的属性比如长度.笔迹的粗细等等:但他们也有不同的特点 ...

  2. 我爸是李刚 java_深入理解java继承从“我爸是李刚”讲起

    前言 本文主要多方面讲解java继承,旨在让初学者通俗易懂,至于"我爸是李刚",反正楼主也不知道谁爸是李刚. @ 1.继承的概述 1.1.继承的由来 至于由来简单一句话:多个类中存 ...

  3. java 关注公众号没有调接口_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

  4. Java继承_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

  5. 夯实Java基础系列23:深入理解Java继承、封装、多态的底层实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  6. 龙卷风java_程序设计-理解java继承-遁地龙卷风

    (0)写在前面 编程和现实世界是息息相关的,你是如何理解现实世界中的继承呢? 继承在编程中应理解为:对父类资源(本文只讨论方法)的使用,父类方法只提供类基本的功能,父类方法之间不存在调用关系. (1) ...

  7. Java继承个人的理解_我对java继承的理解

    关于java继承和多态的文章已经很多了,如果你对java的继承和多态已经有很好的理解,请绕过本变文章, 如果你对java的继承和多态不是很理解,还在找寻这方面的东西,那这篇文章可能对你有所帮助. 首先 ...

  8. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  9. Java继承注意事项难点理解

    继承(干货0.0) 继承是存在与面向对象程序中两个类之间的一种关系.被继承的类称为父类或超类,而继承父类的类称为子类.父类实际上是所有子类的公共域和公共方法的集合.每个子类是父类的特殊化. Java继 ...

最新文章

  1. gcc与gdb,函数小结
  2. 怎么获取上一个html网页传过来的值_爬虫:一个简单实例说明爬虫机制
  3. 读书笔记 -《深入理解计算机系统》2.1
  4. Qt Creator添加3D视图
  5. Netty实战 IM即时通讯系统(九)实现客户端登录
  6. Android MVP模式简单易懂的介绍方式 (一)
  7. Centos Cacti 0.8.8g
  8. dev项目属性按钮是灰色_Spring Boot 中的项目属性配置
  9. CakePHP 1.2的五个新特性
  10. 附件下载原来如此简单
  11. 解决WINDOWS 7中显示摄像头的简易方法
  12. python工厂模式看不懂_python模式 工厂模式原理及实例详解
  13. ubuntu下git使用
  14. 小甲鱼python电子版_小甲鱼学python
  15. WAP在线浏览器大全
  16. 百变人脸,趣味容颜,ALAE 人脸玩出新高度!
  17. 真正的【清华大学计算机系】是什么样子?
  18. opencv图像灰化_Opencv——彩色图像灰度化的三种算法
  19. 经天测绘测量工具包_公共土地测量系统
  20. Matlab快速导入数据文件

热门文章

  1. 在H5中使用腾讯地图,实现定位,距离计算,实时搜索,地址逆解析
  2. 华为手机助手上架流程_华为手机资料导入功能使用教程 看完你就知道了
  3. 人体动动识别论文(骨骼信息,CNN)
  4. Win10查看图片dpi。将低dpi的改为高dpi格式。
  5. 解决echarts中国地图南海岛屿为空的问题
  6. uboot启动时向kernel传参之 logo显示(2)
  7. switch-case的结构及一些注意事项
  8. php中word下载
  9. 解决关于0 errors and 27 warnings potentially fixable with the `--fix` option.的问题
  10. 长安大学汇编课设实现9-0S的秒表计数(西安唐都仪器实验箱)