继承Extends

继承可以解决代码复用,让我们的编程更加接近人类思维,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。

【基本语法】

class 子类 extends 父类{
}
  1. 子类就会自动拥有父类定义的属性和方法
  2. 父类又叫超类,基类
  3. 子类又叫派生类

Java-面向对象特征-继承_初始化

【好处】

  1. 代码的复用性提高了

  2. 代码的扩展性和维护性提高了(在父类添加一个方法,其子类也会拥有)

【细节】

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问。

  2. 子类必须调用父类的构造器,完成父类的初始化
    2.1 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会先调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
    2.2 当父类的无参构造器被覆盖时,要在子类的构造器中调用super(形参列表);即指定哪个父类构造器

  3. 如果希望指定去调用父类的某个构造器,则显式的调用一下:super();
    3.1 super在使用时,需要放在构造器第一行
    3.2 super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器中

  4. Java所有类都是Object类的子类,Object是所有类的基类
    4.1 父类构造器的调用不限于直接父类,将一直往上追溯直到Object类(顶级父类)
    IDEA指着类按ctrl+H可以看到它的父类

  5. 子类最多只能继承一个父类(指直接继承),即Java中是单继承机制。(不能滥用继承,子类和父类必须满足is-a的逻辑关系,比如Student is a People)

父类
Java-面向对象特征-继承_初始化_02

子类
Java-面向对象特征-继承_Java_03

主类
Java-面向对象特征-继承_初始化_04

【继承的本质分析】

Java-面向对象特征-继承_父类_05

字符串在对象内的存储信息是地址,指向方法区内的常量池。基本数据类型就直接存储在对象内,如图的age

根据【子类必须调用父类的构造器,完成父类的初始化】,以及【Object是所有类的基类】,可以得到:

当创建如图的son对象时,会从当前类往上寻找父类,最终到Object类,然后从上往下一步步完成父类的初始化,这些信息存储在son对象内。【如图是先GrandPa,然后Father,然后是Son】

如图设计的三个类都有一个同名属性name,那么当要使用son.name时,规则如下:

  1. 首先看子类是否有该属性

  2. 如果子类有这个属性,并且可以访问【权限修饰符】,则返回信息

  3. 如果子类没有这个属性,就看父类有没有这个属性以及是否可以访问,同时满足时返回信息;若父类及上级父类都有这个属性,但是父类的这个属性是私有的,那么它将阻隔继续访问上级父类的这个属性,编译报错。

【例子】

Java-面向对象特征-继承_Java_06

首先走进B的无参构造器,然后进入this("abc");进入B的这个形参是字符串的构造器内,第一行隐含的是super();所以走进A的无参构造器。
所以输出是a b name b