这里会用到继承以及多态的知识点,但不会将这两项分开来描述,而是将这二者合在一起来讲一讲对象初始化的顺序。
这里是一段继承内部多态方法行为的代码。
class Glyph {
void draw() {
System.out.println("Glyph.draw");
}
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int i) {
radius = i;
System.out.println("RoundGlyph.RoundGlyph(i).radius=" + radius);
}
void draw() {
System.out.println("RoundGlyph.draw().radius=" + radius);
}
}
public class ThePolymorphismInExtends {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
输出结果:
Glyph() before draw()
RoundGlyph.draw().radius=0
Glyph() after draw()
RoundGlyph.RoundGlyph(i).radius=5
为什么这个radius怎么会输出为0呢?
这就要说一说对象的是初始化顺序了。
1).在其他任何事物发生之前,分配给对象的存储空间初始化为0。
2).调用基类构造器,并在内部调用draw()方法,当时这个方法被覆盖了,所以只能调用覆盖过后的draw()方法,并在内部输出了radius。由于第一步,所以输radius出为0。
3).初始化实例对象。
4).调用导出类构造器。
大概的顺序就是先对导出类分配存储空间并初始化为0,也就是先对调用基类的构造方法(假如基类中需要初始化对象,那么就先初始化对象在调用基类构造器),然后初始化导出类里面的对象,最后调用导出类的构造方法。大概就是假如小兔子要出生的话就要有大兔子dad,但是你的形状已经确定了,只是具体能长成什么样子就看你自己了。
(欢迎指正批评!!!)
参考书籍:《Thinking in Java》