多态:也称动态绑定,后期绑定或者运行时绑定
8.3 构造器和多态
1.基类的构造器总是在导出类的构造过程中被调用的,并且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用,因为构造器具有一项特殊任务,检查对象是否被正确的构造,导出类只能访问它自己的成员,不能访问基类的成员(通常都是定义成private),只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化,因此,必须令所有的构造器都得到调用。
构造器的调用顺序:
1)调用基类构造器。
2)按照声明顺序调用成员的初始化。
3)调用导出类的构造器的主体。
初始化的实际过程:
public class Father{
public Father() {
System.out.println("父亲的构造方法");
playMusic();
System.out.println("父亲的构造结束");
}
public void playMusic(){
System.out.println("我是父类,我在放音乐!");
}
}
public class Child extends Father{
private int i=2;
public Child() {
System.out.println("孩子的构造方法,i="+i);
}
public void playMusic(){
System.out.println("我是子类,我在放音乐!i="+i);
}
}
输出:
父亲的构造方法
我是子类,我在放音乐!i=0
父亲的构造结束
孩子的构造方法,i=2
通过以上分析可以得出:
1)在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
2)如前所述那样调用基类构造器,此时,调用被覆盖后的playMusic()方法,并且调用该方法是在调用Child()构造器之前调用的,由于基类的构造器还没有执行完,此时执行被覆盖后的playMusic()方法输出i的值时,为默认的初始值。
3)按照声明的顺序调用成员的初始化。
4)调用导出类的构造器的主体。
8.5 用继承进行设计
当导出类有额外的接口时,当向上转型后,导出类中接口的扩展部分就不能被基类访问,想要访问可以通过向下转型。告知是要具体转型到哪个导出类,转型失败会抛出ClassCastException异常。