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 r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
结果如下:
分析过程:
1.运行程序,找到程序入口main(),加载和初始化main()所在的类PolyConstructors(因为没有static成员,所以看不到具体的初始化变化);
2.开始执行main()中的代码new RoundGlyph(5); 因为是首次new RoundGlyph(5),所以会引起类RoundGlyph的加载和初始化,因为继承关系存在,所以先
加载和初始化父类Glyph,因为父类Glyph没有static成员,所以看不到具体的初始化变化,接着加载和初始化子类RoundGlyph,同样因为没有static成员,
所以看不到具体的初始化变化;
3.至此子父类均加载和初始化完成了,现在开始创建new RoundGlyph(),也即开始实例化对象,首先加载子父类的所有实例变量(设置基本变量为0,引用变量
为null),然后先依次初始化父类的实例变量(构造代码块可以理解为实例变量),接着初始化构造函数。
4.接着依次初始化子类的实例变量(构造代码块可以理解为实例变量),接着初始化构造函数。
5.输出结构。
/* Output:
Glyph() before draw()
RoundGlyph.draw(), radius = 0 因为在初始化父类实例变量之前,子父类的所有实例变量都已加载完毕,此时radius=0;
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
*///:~
欢迎大家指正!!