在初始化過程當中調用的多態方法產生的問題

首先看一下代碼:ide

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 i){
        radius = i;
        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);
    }
}
View Code

好,咱們跑一下,納尼,爲何輸出的是spa

Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5code

下面我來講一下運行過程當中的過程,我想大家就知道爲何會這樣了。對象

首先,在其餘任何事物發生以前,將分配給對象的存儲空間全都初始化爲二進制的零。blog

而後,開始調用構造器,先調用基類的構造器,在這個過程當中,調用的draw()方法是被子類對象覆蓋後的draw()方法而不是基類的draw()方法,這時須要特別注意的一個地方。這裏因爲第一步的緣故,radius的值爲0;event

其次,按照聲明的順序調用成員的初始化方法。class

最後就是調用導出類的構造器了。cli

相關文章
相關標籤/搜索