簡體   English   中英

我是否應該將構造函數定義為擴展抽象類的類?

[英]Should I define a constructor is a class that extends an abstract class?

如果我有這個抽象類:

package com.abc;

public abstract class Player {
    private String name;

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

    public String getName() {
        return name;
    }
}

當我從抽象類擴展一個新類時,新類默認情況下是否使用繼承的構造函數,還是必須創建一個調用“ super”的構造函數?

默認情況下,它將使用默認的空構造函數。 由於您顯式提供了一個構造函數,因此不會獲得默認的構造函數。 因此, 是的,您必須顯式調用super(String) 如果您不希望使用該限制,則應在Player添加一個空的構造函數。

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

默認情況下,如果未顯式添加構造函數,則Java編譯器將在其中添加默認構造函數和super() 由於您的Player類具有參數化構造函數,因此您需要調用super

我必須創建一個調用“ super”的構造函數嗎?

是的,您需要顯式添加默認構造函數。

public Player() {}

要么,

您可以在子類中添加帶有參數的super() 如下所示:

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

如果需要,還可以重載構造函數。 閱讀有關構造函數重載super() 更多信息

由於您的基類Player缺少默認的構造函數 (如果您提供其他構造函數,則自動生成的構造函數將被有效刪除),因此派生類中的所有構造函數都需要從String顯式調用該構造函數。

您可以通過為傳遞的name使用具有適當值的super來實現。 那必須是任何子類構造函數中的第一條語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM