Java多態-構造器內部的多態方法的行為

問題

如果在一個構造器內部,調用正在構造的對象的某個動態綁定方法,那會發生什么情況呢?

代碼

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.RoundGlyph(), radius = " + radius);
    }

    @Override
    void draw() {
        print("RoundGlyph.draw(), radius = " + radius);
    }
}

class RectangularGlyph extends Glyph {
    private int width = 4;

    private int height = 5;

    RectangularGlyph(int width, int height) {
        this.width = width;
        this.height = height;
        print("RectangularGlyph.RectangularGlyph(), width = " + width + ", height = " + height);
    }

    void draw() {
        print("RectangularGlyph.draw(), area = " + width *
                height);
    }
}

/**
 * 在基類構造器中,調用動態綁定的方法,則導出類方法被調用時,導出類的成員實際上還未被初始化;
 * 當調用到導出類的構造器時,導出類的成員已經被初始化了;
 */
public class E15_PolyConstructors2 {
    public static void main(String[] args) {
        new RoundGlyph(5);
        print("------------------------------");
        new RectangularGlyph(2, 2);
    }
}

輸出結果

Glyph() before draw()  
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
------------------------------
Glyph() before draw()
RectangularGlyph.draw(), area = 0
Glyph() after draw()
RectangularGlyph.RectangularGlyph(), width = 2, height = 2

結論

類初始化的實際過程是:

  1. 在其他任何事物發生之前,將分配給對象的存儲空間初始化成二進制的零。
    這也解釋了為何基類構造器中調用動態綁定方法時為何 radius = 0area = 0
  2. 調用基類構造器
  3. 按照聲明的順序調用成員的初始化方法
  4. 調用導出類的構造器主體
    這解釋了導出類構造器中為何:radius = 5width = 2, height = 2
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容