设计构造器的规则:
用尽可能简单的方法使对象进入就绪状态;如果可能,避免调用任何方法。
例子
abstract class Glyph {
abstract void draw();
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
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);
}
}
输出:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
分析:
初始化的实际过程
- 在采取其他任何操作之前,为对象分配的存储空间初始化成二进制零。
- 就象前面叙述的那样,调用基础类构建器。此时,被覆盖的draw()方法会得到调用(的确是在RoundGlyph 构建器调用之前),此时会发现radius 的值为0,这是由于步骤1造成的。
- 按照原先声明的顺序调用成员初始化代码。
- 调用衍生类构建器的主体。