1. 代码
package com.fqyuan.thinking;
class Glyph {
void draw() {
System.out.println("Glyph.draw()");
}
public Glyph() {
System.out.println("Glyph before draw()");
draw();
System.out.println("Glyph after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
public RoundGlyph(int radius) {
this.radius = radius;
draw();
}
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructor {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
//Running result:
Glyph before draw()
RoundGlyph.draw(), radius = 0
Glyph after draw()
RoundGlyph.draw(), radius = 5
2. 解释
The order of initialization:
1). The storage allocated for the object is initialized to be binary zero before anything else happens.
2). The base-class constructors are called as described previously. At this point, the overridden draw() method is called(yes, before the RoundGlyph constructor is called), which discovers a radius value of zero, due to step 1.
3). Member initializers are called in the order of declaration.
4). The body of the derived-class constructor is called.
构造函数初始化顺序:
首先基类构造函数被调用。此时,被重写的override方法被调用了(是的,你没看错,被重写的方法在扩展类构造函数没有被调用时就被调用了),所以这里的类变量被初始化为默认值0 。
然后成员初始化按照被声明的顺序被初始化调用。
最后才执行的是扩展类的构造函数。