2017-06-21 86 views
1

如果我有這個抽象類:我應該定義一個構造函數是一個擴展抽象類的類嗎?

package com.abc; 

public abstract class Player { 
    private String name; 

    public Player(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

當我延長從抽象的一個新的類,它的新類默認使用繼承的構造,或者我必須創建一個所謂的「超級構造「?

+0

我認爲你應該調用'超級' – vm345

+0

它取決於抽象類是否有一個沒有參數的構造函數 – AxelH

+1

@AxelH它會出現如此:'public Player(String name){'。 –

回答

5

默認情況下,它將使用默認的空構造函數;因爲你明確提供了一個構造函數,所以你不會得到默認的構造函數。因此,您必須明確請致電super(String)。如果你不想要這個限制,那麼你應該給你的Player添加一個空的構造函數。

protected Player() { // <-- only visible to sub-classes. 
    // ... implicit super(); 
} 
+0

很好的解決方法。有一個upvote。這是慣用的Java嗎? – Bathsheba

+0

@Bathsheba地道的意義在哪?這是一個抽象類,所以無論如何都不能實例化。但我認爲是的,也考慮包私有(例如無訪問修飾符)......那麼你可能在該包中有一個工廠(或生成器),只有它(或同一包中的其他東西)才能實例化該類。同樣的想法,僅限於子類。 –

2

因爲你的基類Player缺少默認構造函數(如果您提供的任何其他構造函數自動生成一個有效的刪除),在派生類中的所有構造函數需要調用從String明確的構造。

您可以通過使用super並通過適當的值name來做到這一點。這必須是任何子類構造函數中的第一個語句。

3

默認情況下,如果您沒有明確添加構造函數,Java編譯器將在其中添加默認構造函數和super()。因爲你Player類的有參數的構造函數,你需要調用super

我必須創建一個所謂的「超級」構造?

是的,你需要明確地添加默認構造函數。

public Player() {} 

或者,

您可以在子類與參數添加super()。如下所示:

public ChildClass(String name) { 
    super(name); 
} 

如果你想要,你也可以重載構造函數。 read more about constructor overloading和約super()

+0

我不確定要理解答案的第二部分,OP提到需要從子類中調用super。所以發生同樣的問題。 – AxelH

+0

@AxelH是的,謝謝你,他要求繼承'Player'的類。我知道了。我將更新 – Blasanka

+0

@AxelH現在就是它。再次感謝提及。 – Blasanka

相關問題