构造器内部的多态方法的行为
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);
}
}
上面代码可以看出,导出类重写了基类的draw()方法,所以new RoundGlyph时,Glyph()中的draw()调用的是RoundGlyph中重写的draw()方法,但是由于初始化顺序的原因,radius并没有赋值,所以radius的值为0。
初始化实际过程是: 1.在其他任何事物发生前,将分配给对象的存储空间初始化成二进制的零。 2.调用基类构造器。此时,调用被覆盖后的draw()方法(要在调用RoundGlyph构造器之前调用),由于步骤一的缘故,此时radius的值为零。 3.按照声明的顺序调用成员的初始化方法。 4.调用导出类的构造器主体。