看个例子
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, radius = " + radius);
}
void draw()
{
System.out.println("RoundGlyph, radius = " + radius);
}
}
public class Test {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
输出结果
Glyph before draw()
RoundGlyph, radius = 0
Glyph after draw()
RoundGlyph, radius = 5
看到这个输出结果,我也是醉了。第二行居然输出的是0,首先radius初始化的是1,然后main中创建对象是传入的是5,这就有点奇怪了。
而且在Glyph中调用的draw方法居然是RoundGlyph中的draw方法。
用书上的一段话“如果构造器只是在构建对象过程中的一个步骤,并且该对象所属的类是从这个构造器所属的类导出的,那么到处部分在当前构造器正在被调用的时刻仍旧是没有被初始化的。然而,一个动态绑定的方法调用却会向外深入到继承层次结构内部,它可以调用导出类里的方法”
初始化的实际过程
1.在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
2.初始化基类构造器
3.按照生命的顺序调用成员的初始化方法
4,.调用导出类的构造器主题
这样的错误,如果遇到了不知道要调多久才可以调出来。。。
编写构造器的准则“用尽可能简单的方法是对象进入正常状态;如果可以的话,避免调用其他方法”。在构造器内唯一能安全调用的那些方法是基类中的final方法(private也是它隶属于final方法)