所有類都至少有一個構造函數。如果一個類不顯式聲明任何類,則Java編譯器會自動提供一個名爲默認構造函數的無參構造函數 。如果該類沒有其他父類,則此構造函數的默認構造函數將調用父類的無參數構造函數,或者 對象構造函數。 如果父代有 沒有構造函數(Object有一個),編譯器會拒絕 程序。爲什麼編譯器會抱怨超類沒有構造函數,當默認的構造函數被自動賦予一個沒有構造函數的類?
(source)
不過呢,Object
是Java中的每個類的(直接或間接)父。
假設我們有一個類A
,它沒有明確擴展任何類,所以它隱式擴展了Object
。另外假設,A
沒有明確提供構造函數,因此編譯器會自動添加一個默認的構造函數,它將調用其超類(並且Object
確實具有構造函數)的構造函數。
現在假設我們有一個擴展類A
的類B
,它沒有提供顯式構造函數,所以編譯器自動爲它提供一個默認的構造函數;這個默認構造函數試圖從A
調用構造函數。
現在爲什麼編譯器錯誤在B
,當編譯器已經提供了一個(默認)構造函數A
(被調用Object
的構造,以及Object
有一個)?
編輯:
測試:編譯成功! 這是否意味着本教程中的最後一句不正確?
class A extends B {
public static void main(String [] args) {
//A a = new A();
System.out.println("Yayyy");
}
}
class B {
}
你測試過了嗎?我絕對期待這一點。 –
@LouisWasserman不,信任它,因爲它在*官方* Java教程。 – Solace
僅僅因爲它的官方並不意味着它是有道理的。它只是說所有類在段落的開頭至少有一個構造函數!所以沒有沒有構造函數的東西。 –