多态
一、向上转型
把对某个对象的引用视为对其基类型的引用的做法,称作向上转型。
eg.
定义一个方法play(),参数是Instrument类型;类wind extends Instrument,类Brass extends Instrument;则调用时可以把子类的对象引用传参给方法:
play(wind);
play(Brass);
这么做,就不用多余的为每一个乐器都编写play方法,而是只写乐器类的play方法,然后子类向上转型去调用。
二、动态绑定
将一个方法调用和方法主体关联起来叫做绑定;动态绑定是指在程序运行时根据对象的类型进行绑定;Java的动态绑定是自动发生的。
eg.
// 创建一个Circle对象,并把得到的引用传给它的父类Shape Shape s = new Circle(); // 此时调用draw()方法(这是基类方法,在子类中也被覆盖了),此时由于动态绑定(多态),程序会正确调用Circle类里的draw()方法 s.draw()
一旦知道Java中所有的方法都是通过动态绑定实现多态这个事实后(除final方法),我们就可以编写只与基类打交道的程序代码了,并且这些代码对所有导出类都可以正确运行。
三、构造器和多态
构造器的调用顺序:
- 调用基类构造器,从最顶层递归向下;
- 按声明顺序调用成员的初始化方法;
- 调用导出类的构造器主体。