java-当我在构造函数中调用方法时会发生什么?

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.

Era*_*ran 6

您正在构建一个RoundGLyph实例.构造函数RoundGLyph调用超类的构造函数Glyph- 调用draw()方法.因为 RoundGLyph覆盖Glyphdraw()方法,该Glyph构造函数调用RoundGLyph draw()方法,打印的值radius.

但是,由于在RoundGLyph实例完全初始化之前调用它(RoundGLyph构造函数的主体尚未执行,甚至radius = 1尚未执行初始化),因此radius变量仍保持默认值0.由于Java语言的这种行为,建议不要在构造函数中调用非final方法(因为它们可以被覆盖).