2012-03-10 31 views
1

我有以下兩類:二OO問題,章構造

public class Animal { 
    public Animal() { 
     this("Animal->Horse"); 
     System.out.println("Class Animal default const"); 
    } 

    public Animal(String name) { 
     this.name = name; 
     System.out.println(this.name); 
    } 
    String name; 
} 

public class Pegasus extends Animal { 
     public Pegasus() { 
     System.out.println("Class Pegasus default const"); 
    } 

    public static void main(String[] args) 
    { 
     Animal animal = new Animal("Black Horse"); 
     animal.name = "Pegasus"; 
     Pegasus pegasus = new Pegasus(); 
     pegasus.name = "White Horse"; 
    } 
} 

當我執行此我得到:

Black Horse 
Animal->Horse 
Class Animal default const 
Class Pegasus default const 

Q1:爲什麼Animal->Horse得到印刷一次當animal實例是否創建了pegasus實例?本質上它是從默認的構造函數中調用的。另外爲什麼不animal實例打印Class Animal default const

Q2:當我創建了pegasus情況下,有沒有辦法爲它不叫class Animal的默認構造函數並調用class Pegasus默認構造函數?

+1

爲什麼要在動物構造函數中打印出「Animal-> Horse」?這意味着你正在創造一匹馬作爲默認動物,這可能是也可能不是這個意圖。無論如何,名爲「動物」的類應該是抽象的,因爲當有人問你「什麼是動物?」時你可以(可能會)用「它取決於它是什麼樣的動物」來回答它。 – 2012-04-22 19:35:32

+0

@ArnabDatta:謝謝:)但這只是打印一些東西。但我明白這一點。 – noMAD 2012-04-22 23:38:19

回答

7

問題1:動物實例創建時爲什麼Animal-> Horse只打印一次而不是創建Pegasus實例?

這是倒過來 - 這是當你調用Animal(String)構造與new Animal("Black Horse")正在打印,但它當你調用Pegasus()構造函數,再調用Animal()構造正在打印這又調用Animal(String)構造函數。

我強烈建議你在的new Animal("Black Horse")構造函數調用後加上一行額外的診斷文本。這將幫助你更清楚地看到發生了什麼。

Q2:當我創建了飛馬情況下,是有它不調用類動物的默認構造函數

那麼它可以調用Animal(String)構造例如一種方式與

super("Pegasus"); 

,但它必須調用Animal一些構造。在創建類的實例時,必須通過每個類中的至少一個構造函數初始化其繼承層次中的類。

+0

+1,打我吧。 – Jeffrey 2012-03-10 21:58:28

+0

啊,我明白了。但是,如果超類沒有任何構造函數的實現,那麼派生類自己調用什麼?它是默認的構造函數嗎?但是目的是什麼? – noMAD 2012-03-10 22:06:22

+0

對於沒有明確定義一個類的每個類都定義了一個隱含的無參數構造函數。 – 2012-03-10 22:10:24

1

Q1:兩個構造函數都有「相等的計費」,所以不需要1-arg方法來調用無參數構造函數。所以唯一被調用的ctor就是1-arg,它給你輸出的第一行。

Q2:你飛馬是動物的一個實例,因此,纔可以開始初始化飛馬部分,它必須首先初始化動物部分。要做到這一點,它需要選擇一個動物構造函數。既然你沒有明確地調用它,它會選擇「默認」版本,即沒有參數。無arg-one首先調用one-arg one,併爲您提供第二行輸出。然後,沒有arg的繼續你的第三條輸出線。最後,你的Pegasus ctor現在可以被調用,導致你的第四行。