2012-06-16 32 views
5

在這本書我讀國中總結overiding構造教科書的部分不決策意識

「從技術上講,構造函數不能overidden因爲它們具有相同的名稱與當前類的文本。新的構造函數創建的,而不是。被繼承了該系統工作正常; ......「

我不明白的部分是,當他們這樣說:

」當你的類的constuc tor方法被調用,所有超類的相同簽名的構造方法也被調用。因此,初始化可以發生一類的所有部分你繼承」

我不明白的是相同的簽名部分....它配備防空火炮向我,好像所有構造函數必須具有相同的簽名,然後當你初始化一個子類對象時,它的所有超類將自動被調用,而不必爲每個子類調用super(arg1,arg2)....這就是他們說的嗎?

+0

哪本教科書? – UmNyobe

+0

現在,我在21天內堅持使用Sams Teach Yourself Java 2。稍後將趕上java的新功能。但這是他們在說什麼? –

+0

嗯,你是正確的混淆,因爲它是不正確的... – UmNyobe

回答

2

當你的類的構造函數被調用時,所有超類的具有相同簽名的構造函數方法也被調用。因此,初始化可能發生在您繼承的類的所有部分上

這是不正確的。首先,關於術語的註釋:構造函數不是方法,所以術語「構造函數方法」沒有任何意義。

雖然確實調用了超類構造函數,但它不需要具有相同的簽名。如果一個子類的構造開始於超類構造函數調用表達式如

class Student extends Person { 
    public Student(String name) { 
     super(name, Occupation.STUDENT); 
    } 
} 

超類構造中調用匹配參數計數和類型。您完全免費將您傳遞給該構造函數的參數。

如果子類構造函數沒有以超級構造函數調用表達式開始,編譯器會爲您插入對超類的可訪問零參數構造函數的調用,或者如果沒有這樣的構造函數,則會引發編譯錯誤。

將由Sams的Java 2 21天,現在

你都知道的Java 2是一個十年已經過時?任何這本舊書都會教你過時的東西,你最好儘快忘記。爲什麼不使用更現代化的書?

10

那不是如果它是默認構造函數(即無參數構造函數),那麼超類的構造函數只會自動調用。

如果您的超類s沒有默認的構造函數,那麼你必須用super(args..)明確地調用你選擇的構造函數。

例如,這是完全正常的,儘管事實是BearManPig的構造比Animal不同的簽名:

public class Animal { 
    public Animal() { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    } 
} 

那是因爲有一個Java中的默認的無參數的構造函數。

現在,當沒有默認的構造函數時,您必須明確指出要調用哪一個。例如,這工作:

// DOESN'T COMPILE 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    // There is no default constructor, stupid Java can't figure out what to do 
    public BearManPig(String string) { 
    } 
} 

但這:

// does compile 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    super(string); // I've told Java what to do 
    } 
} 
+0

嗯謝謝@Tim Pote,這是我的想法,但我讀了這段文字,它讓我困惑。 –

4

所有超類不需要具有相同的構造函數的簽名。
當您創建新對象時,如果沒有定義構造函數,Java將不會調用超類的參數構造函數。如果您沒有定義任何其他構造函數,則Java不提供參數構造函數。
如果您定義了任何其他構造函數,則必須在子類構造函數內調用它(在第一行)。
This可能會有所幫助。