2012-09-12 74 views
2


         我已創建使用多態性陣列的基本程序的繼承。在父類中,此數組循環遍歷,並且每個索引處的每個對象(從子類創建)都執行父類的實例方法。

         作爲一個實驗中,我創建父類型子級其的構造方法中的一個對象,並從那裏執行父級實例方法。

         對於我的原因未知,這是造成實例方法(從子級執行構造函數)來執行的次數作爲父級的長度多態性陣列 (如果多態陣列具有元素,則將執行子類的方法調用)。

這是什麼奇怪的繼承循環?


這裏是父類:

public class MyClass 
{ 
    // instance variables 
    protected String name; 
    protected String numStrings; 

    // constructor 
    public MyClass(String name) 
    { 
     this.name = name; 
    } 

    // instance method 
    public void getDescription() 
    { 
     System.out.println("The " + name + " has " + numStrings + " strings."); 
    } 

    // main method 
    public static void main(String[] args) 
    { 
     MyClass[] instruments = new MyClass[2]; 

     instruments[0] = new Child("Ibanez bass guitar"); 
     instruments[1] = new Child("Warwick fretless bass guitar"); 

     for(int i = 0, len = instruments.length; i < len; i++) 
     { 
      instruments[i].getDescription(); 
     } 
    } // end of main method 
} // end of class MyClass 


......這裏是兒童類:

public class Child extends MyClass 
{ 
    // constructor 
    public Child(String name) 
    { 
     super(name); // calling the parent-class' constructor 
     super.numStrings = "four"; 

     MyClass obj = new MyClass("asdf"); 
     obj.getDescription(); 
    } 
} // end of class Child 


...這裏是輸出:

The asdf has null strings. 
The asdf has null strings. 
The Ibanez bass guitar has four strings. 
The Warwick fretless bass guitar has four strings. 


+1

這裏沒有繼承循環。 'MyClass obj'似乎比有用的更混亂,所以我會刪除它。 –

+1

請記住,輸出流(System.out,System.err)不同步,所以輸出的順序是偶然的。 –

+0

感謝@MarcinSanecki,這很有趣......那麼他們是按照處理時間的順序執行的呢?什麼可能是更好的替代測試? –

回答

3

問題的行是這樣的:

MyClass obj = new MyClass("asdf"); 

如果你只是簡單地調用,而不是obj.getDescription()getDescription(),它應該沒問題。由於'Child'擴展了'MyClass',超級構造函數調用用於初始化超類中的所有內容(現在我們假設您可以將其想象爲隱含的new MyClass("...")),您不必顯式實例化MyClass。

+3

+1這與所有不需要創建'new MyClass'完全相同。 –

+0

好的,nvmnd我現在明白這個部分,正如'tucuxi'在這裏解釋的那樣。 –

3

任何地方都沒有奇怪的繼承循環。創建兩個子實例,每個實例的執行這段代碼

MyClass obj = new MyClass("asdf"); 
    obj.getDescription(); 

,並打印「航空自衛隊擁有空字符串。」,符合市場預期。請注意,obj已準備好進行垃圾收集,因爲在此代碼執行後它不再可訪問。也就是說,這兩行是不必要的,它們的唯一效果是輸出「asdf有空字符串」。超類的構造函數在你編寫super(「something」)時已經被調用。

然後,兩個子對象最終打印出來,並具有正確的值。

+0

謝謝@tucuxi!啊,我明白了 - 所以這裏的第一行打印出消息,然後第二行打印消息(與main方法中循環的數組長度一致)。你能否進一步解釋一下超類的構造函數是「......即使你自己沒有包含它,也會隱式生成」? –

+0

糟糕,我的壞 - 構造函數只有在沒有參數時才被隱式調用。修正了我的答案。 – tucuxi

+0

啊,是的,好吧,這更有意義,再次感謝@tucuxi。 –