package polymorphism;
class Glyph{
static{
System.out.println("static 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) {
this.radius=r;
System.out.println("RoundGlyph.RoundGlyph().radius="+radius);
}
void draw(){
System.out.println("RoundGlyph.radius="+radius);
}
}
public class PolyConstructor {
public static void main(String[] args) {
new RoundGlyph(5);
System.out.println("-----------------");
new Glyph();
}
}
结果:
static Glyph
Glyph before draw
RoundGlyph.radius=0
Glyph after draw
RoundGlyph.RoundGlyph().radius=5
-----------------
Glyph before draw
Glyph draw
Glyph after draw
结果分析:
我们发现当Glyoh的构造器调用draw()方法时,radius不是默认的1,而是0。
初始化实际过程如下:
1.在其他任何事情反生之前,讲分配给对象的存储空间初始化成二进制的零。
2.如前所述那样调用基类构造器,此时,调用被覆盖后的draw()方法,由于步骤1的缘故,我们此时发现radius的值为0。
3.按照声明的顺序调用成员的初始化方法。
4.调用导出类的构造主体。