構造器中呼叫動態繫結的方法

lll_564發表於2020-11-29

構造器中呼叫動態繫結的方法

若在構造器中呼叫動態繫結的方法,不會呼叫父類的方法,而是優先呼叫子類中覆蓋的繫結方法。
如果此時在方法中使用成員變數可能會造成重大錯誤。
class Glyph {
    void draw() {
        System.out.println("G() in draw");
    }
    Glyph() {
        System.out.println("G() before draw");
        draw();
        System.out.println("G() after draw");
    }
}
class RoundGlyyph extends Glyph {
    int r = 1;
    RoundGlyyph(int r) {
        this.r = r;
        System.out.println("R(), r = "+r);
    }
    void draw() {
        System.out.println("R() in draw, r = "+r);
    }
}
public class extendTest {
    @Test
    void initExtendsTest() {
        new RoundGlyyph(5);
    }
}
此處在僅僅分配控制程式碼時物件對應的儲存空間為二進位制全0。
而在父類Glyph構造器中呼叫了子類RoundGlyph的方法draw(),此時子類的成員物件還未初始化,得到的半徑r為二進位制全0,不是初始化的1,更不是構造器設定的5。

所以要注意構造器內能安全使用的方法在基礎類中必須宣告為final。

相關文章