簡體   English   中英

在Java中繼承構造函數

[英]Inheriting a constructor in java

當我們在Java中使用繼承時,是否可以通過子類繼承超類的構造函數?

tutorialspoint上它說:

子類從其超類繼承所有成員(字段,方法和嵌套類)。 構造函數不是成員,因此它們不會被子類繼承,但是可以從子類中調用超類的構造函數。

但是在同一教程的某處說:

如果一個類繼承了另一個類的屬性,則子類將自動獲取超類的默認構造函數。

所以我想知道子類可以繼承超類的構造函數嗎?

所以我想知道子類可以繼承超類的構造函數嗎?

構造函數不能被繼承。

繼續,我設法在tutorialspoint找到與您相關的源。

重要的是要注意,在其下面提到的部分明確地標題為“ 調用超類構造函數” ,並且指出:

如果一個類繼承了另一個類的屬性,則子類將自動獲取超類的默認構造函數。 但是,如果要調用超類的參數化構造函數,則需要使用super關鍵字,如下所示。

 super(values); 

簡單地說,這是要說的是,如果子類構造函數未指定要調用的超類構造函數,則編譯器將自動調用超類中的可訪問的無參數構造函數。

但是,一旦超類中存在參數化的構造函數,則必須將其作為派生類的構造函數中的第一條語句調用,否則您的程序將無法編譯。

例如

public class Super { ... }
public class Derived extends Super { ... } // good ! compiler puts in a public default constructor for you.

下面的代碼將無法編譯,您應該得到一個錯誤說明:

在Super中沒有可用的默認構造函數

public class Super {
    public Super(int id) {...} 
}
public class Derived extends Super {...}

這意味着您需要顯式調用Super類的構造函數,作為Derived類的構造函數中的第一條語句,並提供必要的參數,例如

public Derived(){ super(12);}

您可以使用super關鍵字訪問超類構造函數。

您需要在子類中定義構造函數,然后調用超級構造函數。

public class Animal {

    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void play(){
        System.out.println(this.getName() + " is playing ");
    }
}

public class Dog extends Animal{
    public Dog(String name) {
        super(name);
    }
}

public class Test {

    public static void main(String[] args) {
        Dog d = new Dog("Winky");
        d.play();
    }
}

默認情況下,所有超類構造函數都是繼承的,您可以使用子類構造函數調用這些構造函數。

當實例化子類對象時,子類構造函數之前的子類期望它將執行超類構造函數,然后它將繼續執行子類構造函數。 如果您想使用默認超級構造函數以外的其他超級構造函數,則可以從子類構造函數中使用super關鍵字進行調用,並且此調用應該是子類構造函數中的第一條語句。

例:

public Subclass(String msg) {
    super(msg); // calling non default super class constructor
    // any other initialization
}

暫無
暫無

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

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