Luc*_*cas 1 java polymorphism constructor overriding
class Glyph {
void draw() {
print("Glyph.draw()");
}
Glyph() {
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
radius = r;
print("RoundGLyph.draw(), radius = " + radius);
}
void draw(){
print("radius:" + radius);
}
public static void main(String[] args){
new RoundGlyph(5);
}
}
//Glyph() before draw()
radius:0
Glyph() after draw()
RoundGLyph.draw(), radius = 5
Run Code Online (Sandbox Code Playgroud)
代码在上面.
由于draw()不是静态的,因此必须有一个隐含的参数(this).虽然在这种情况下,在Glyph的构造函数中调用draw(),所以我想知道这个"隐式参数"是什么. 据我所知,当我调用tf()时,t为T类型,编译器会把它变成Tf(t).
结果表明,在我看来,它是一个RoundGlyph作为这个参数提供.但这怎么可能?显然,调用draw()时不会创建RoundGlyph.
您正在构建一个RoundGLyph实例.构造函数RoundGLyph调用超类的构造函数Glyph- 调用draw()方法.因为 RoundGLyph覆盖Glyph的draw()方法,该Glyph构造函数调用RoundGLyph draw()方法,打印的值radius.
但是,由于在RoundGLyph实例完全初始化之前调用它(RoundGLyph构造函数的主体尚未执行,甚至radius = 1尚未执行初始化),因此radius变量仍保持默认值0.由于Java语言的这种行为,建议不要在构造函数中调用非final方法(因为它们可以被覆盖).