1.继承中构造方法的关系
1.子类中所有的构造方法默认都会访问父类中空参数的构造方法,除非显式使用super/this调用了父类或者是本类的其他构造方法。
2.在类中对本类或者是父类构造方法的调用,只能是在构造方法中,不能在实例方法中调用构造方法(更不能在类方法中调用构造方法),原因:
- 实例方法被调用时,说明实例对象已经被创建完了,此时不能再使用this/super去初始化本实例或者是父类实例
- 类方法是在本类加载的时候就已经加载的,这时实例对象还没有被创建出来,是不能使用this或者super的
2.
因为子类会继承父类中的数据(成员变量),可能还会使用父类的数据。
所以,子类初始化之前,一定要先完成父类数据的初始化。
换句话说,一个对象的创建意味着它的所有的父类都会被创建出来。
3.子类构造方法的第一条语句:
如果是this(...)表明调用的是本类的另一个构造方法,在另一个构造方法中还可以继续使用this(...)调用本类其他的构造方法,如果有多个构造方法的话,可以继续调用下去,但是不能递归调用,最终总会有一个构造方法,第一条语句不是this()了。
这时,可以显式的调用父类的构造方法super(...);或者什么都不写,这时系统默认调用父类的空参构造方法。
总之,当子类对象被创建的时候,总是会先调用父类的构造方法,直到Object这个最上层的对象被创建出来之后,其下的子类对象才会被创建出来。
4.考察父类,子类代码块的执行顺序
从这个案例中能看到有继承关系的类的实例初始化的过程,以及为什么在类方法中不能使用this或者是super关键字
5.如果父类中没有空参构造方法,怎么办?
1.子类可以通过super去显式调用父类其他的带参的构造方法
2.子类可以通过this去调用本类的其他构造方法,但是本类其他构造也必须首先用super(...)访问了父类的带参构造(因为父类没有空参构造)
6.总结
如果父类没有空参构造,子类的构造方法中就必须显式调用父类带参构造super(...);
一定要注意:
super(…)或者this(…)必须出现在构造方法第一条语句上
否则,就会有父类数据的多次初始化
7.如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?
报错。
如何解决呢?
A:在父类中加一个无参构造方法
B:通过使用super关键字去显示的调用父类的其他带参构造方法
C:子类通过this去调用本类的其他构造方法
子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。
注意事项:
this(...)或者super(...)必须出现在第一条语句上。
如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。
8.继承中成员方法的关系
子父类中存在同名和不同名的成员方法
结论:
通过子类对象去访问一个实例方法
首先在子类中找(是否子类进行了重写,或者是子类特有的方法)
然后在父类中找(子类没重写,而是从父类继承而来的)
9.继承中成员方法的关系:
A:子类中的方法和父类中的方法声明不一样,这个太简单。
B:子类中的方法和父类中的方法声明一样,这个该怎么?
通过子类对象调用方法:
a:先找子类中,看有没有这个方法,有就使用
b:再看父类中,有没有这个方法,有就使用
c:如果没有就报错。
10.方法重写概述
方法重写概述
- 子类中出现了和父类中一模一样的方法声明
称为方法覆盖Override/重写OverWrite
使用特点:
- 如果方法名不同,就调用对应的方法
- 如果方法名相同,最终使用的是子类自己的(使用子类的引用的时候,在多态情况下,使用父类的引用,则有可能调用的是父类的静态方法)
方法重写的应用:
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
- 方法的重写是多态实现的条件
11.方法重写的注意事项
- 父类中私有方法不能被重写,编译报错
- 子类重写父类方法时,访问权限不能更低(后面讲),否则编译报错
- 子类重写父类方法,返回值类型可以相同,或者是父类返回值类型的子类型
- 父类的实例方法(非静态方法),子类不能重新定义为静态方法
- 父类静态方法(类方法),子类也必须通过静态方法进行“重写”(虽然编译和使用都不报错,但其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中会讲解)
- 子类中重写父类方法,按照重写的原则(访问权限不能变小,返回值同类或者子类,方法名相同,形参列表相同);否则子类中定义的同名方法就是方法的重载(继承而来的方法和子类定义的方法构成重载),重载就必须让参数列表不同。如果子类方法只与继承自父类的方法返回值不同,不能构成重载
- 子类如果想重写父类的方法,最好是让方法的签名一模一样
(重写方法的一个重要用途就是:父类的引用能够指向子类的方法,但是静态方法的“重写”,在多态中依然调用的是父类的方法,所以,从这个角度上来讲,子类对父类的静态方法的重写不能算是真正方法的重写)
12.方法重写的注意事项
A:父类中私有方法不能被重写
因为父类私有方法子类根本就无法继承
B:子类重写父类方法时,访问权限不能更低,最好就一致
C:父类静态方法,子类也必须通过静态方法进行重写
其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中讲解
子类重写父类方法的时候,最好声明一模一样。
否则同名的方法就是方法的重载了,就必须让形参列表不同