什么是继承

继承是类与类之间的一种关系
多个类继承单独的某个类,多个类就可使用单独的这个类的属性和行为了
多个类成为子类(派生类),单独的这个类称为父类(基类,超类)

使用继承的好处

提高了代码的复用性
image.png
image.png
image.png

继承设计规范

子类们相同的特性放在父类中定义,子类特有的属性和行为定义在子类自己里面

继承的内存原理

image.png
new之后在堆内存中为对象划分出一块内存空间(这块内存空间分为两个部分一部分是父类空间,一部分是子类空间),并为它分配初始值
image.png

继承的特点

子类可以继承父类的属性和行为,但是子类不能继承父类的构造器

子类不可以继承父类的构造器,父类的构造器用于初始化父类对象
子类是否可以继承父类的私有成员?
可以的,但是不能直接访问,如下图在子类的对象内存中存在父类的私有成员,但是是在父类成员空间之中,并且是private类型,因此不能直接访问(我们可以认为它是房间中的一个保险柜但是我们没有钥匙)
image.png
子类是否能能够继承父类的静态成员?
这是一个有争议的知识点
子类可以直接使用父类的静态成员(共享)肯定是能用的但是不好说是不是继承,因为静态成员是属于类的且只有一份,子类虽然能用但是严格意义上来说静态成员属于父类

java是单继承模式,一个类只能继承一个直接父类

子类只能继承一个直接父类
为什么不能多继承?
image.png
反证法:
C同时继承A,B
A,B中有着一个一样的方法
C调用这个方法时,无法判断用哪一个

java不支持多继承,但是支持多层继承

子类可以继承一个继承了其他类的子类
image.png
就近原则:如果B,C中有一个一模一样的方法,A调用时会选用离他近的那个方法

java中所有的类都是Object的子类

image.png
直接继承 默认继承 间接继承

继承后:成员变量,成员方法的访问特点

在子类中访问成员(成员变量、成员方法)满足:就近原则
先在子类局部找
然后在子类成员范围中找
最后在父类中找,找不到报错
image.png

继承后:方法重写

什么是方法重写

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法

什么时候使用方法重写

当子类需要父类的功能,但父类的该功能不能完成满足自己的需求时
image.png

Override重写注解

@Override是放在重写的方法上,作为重写是否正确的校验注解
加上该注解后如果重写错误,编译阶段会出现错误提示
image.png

方法重写注意事项和要求

重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致
私有方法不能重写
子类重写父类方法时,访问权限必须大于或者等于父类
子类不能重写父类的静态方法

继承后:子类构造器的特点

子类中所有的构造器(无论有参无参)默认都会先访问父类中的无参构造器,再执行自己

原因:
子类在初始化时,有可能会使用父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
字类初始化之前,一定调用父类构造器先完成父类数据空间的初始化

怎么调用父类的构造器

image.png
这句话写不写都是存在的

继承后:子类构造器访问父类有参构造器

super调用父类有参构造器

初始化继承自父类的数据
如果父类中只有有参构造器,子类不做处理直接执行会出现什么情况?

怎么解决这个问题?
super()
image.png
代码书写规范:所有的类最好都写上一个无参构造器**

this,super使用总结

image.png

this调用兄弟构造器

image.png

this()和super()使用注意点

子类中一个构造器通过this()调用兄弟构造器,那它不直接调用父类的构造器,而是通过兄弟构造器去调用表父类的构造器,最终结果还是调用了父类构造器的
this()和super()都只能放在构造器的第一行,所以二者不能共存与同一个构造器,这也是上句话中为什么说调用了兄弟构造器的构造器不能直接调用父类的构造器的原因