继承
简单来说继承就是把多个类中相同的内容给提取出来定义到一个类中。
如何实现
Java提供了关键字:extends
格式
class 子类名 extends 父类名 {} |
好处
- 提高了代码的复用性
- 提高了代码的维护性
- 让类与类之间产生了关系,是多态的前提
弊端
类的耦合性增强了
开发的原则:低耦合,高内聚。
耦合:类与类的关系
内聚:就是自己完成某件事情的能力
Java中继承的特点
- Java只支持单继承,不支持多继承。
- 有些语言是支持多继承,格式:extends 类1,类2,…
- Java支持多层继承(继承体系)
class Father {} |
注意事项
- 子类只能继承父类所有非私有的成员(成员方法和成员变量)
- 子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
- 不要为了部分功能而去继承
this和super
this和super的区别
- this代表本类对应的引用。
- super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
使用
调用成员变量
this.成员变量
调用本类的成员变量
super.成员变量
调用父类的成员变量
调用构造方法
this(...)
调用本类的构造方法
super(...)
调用父类的构造方法
调用成员方法
this.成员方法
调用本类的成员方法super.成员方法
调用父类的成员方法
继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法
因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
注意:子类每一个构造方法的第一条语句默认都是:super();
class Son extends Father { |
如果父类没有构造方法
解决
- 在父类中添加构造方法
class Father { |
- 通过使用
super
关键字去显示的调用父类的带参构造方法
class Father { |
- 子类通过
this
去调用本类的其他构造方法
class Father { |
注意事项
this(...)
或者super(...)
必须出现在第一条语句上。如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。
看程序写结果:
class X { |
结果是:
YXYZ
一个类的初始化过程
- 成员变量的初始化
- 默认初始化
- 显示初始化
- 构造方法初始化
子父类的初始化(分层初始化)
- 先进行父类初始化,然后进行子类初始化
注意
虽然子类中构造方法默认有一个super()
初始化的时候,不是按照那个顺序进行的。
而是按照分层初始化进行的。
它仅仅表示要先初始化父类数据,再初始化子类数据。