2017-02-02 133 views
0

我只是在類ConstructorOne中繼承類ConstructorTwo,而不是創建任何對象(顯式爲atleast)。那麼爲什麼ConstructorTwo類中的構造函數必須是公共的?使用默認構造函數繼承公共類的Java

我得到這個錯誤:ConstructorTwo()在ConstructorTwo中不公開;不能從外面包

package one; 

import two.ConstructorTwo; 

public class ConstructorOne extends ConstructorTwo { 

    public static void main(String args[]) { 

    } 
} 


package two; 

public class ConstructorTwo { 

    ConstructorTwo() { 
     super(); 
     System.out.println("Default constructor in package TWO!"); 
    } 
} 
+1

我認爲你會得到一個編譯錯誤?在你的問題中,這可能是值得的。包括@khelwood在內的 – khelwood

+0

。 –

+0

錯誤是安靜的自我解釋'不能從外部包'訪問。看看[訪問修飾符在java中](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) – Guy

回答

2

,它已經是公開的原因是因爲當Java調用任何構造函數,它必須調用父類的構造函數調用的任何代碼在子類的構造函數之前訪問。如果Java由於隱私錯誤而無法訪問超類構造函數,那麼它將無法執行超類構造函數,這是調用任何構造函數(根據Java)所需的操作。這就是爲什麼它必須公開。

+0

構造器兩個可以從同一個包中的類調用(例如two.MyMain可以調用ConstructorTwo())。 – John

+0

當我沒有創建任何類ConstructorOne的對象時,爲什麼java會在第一個位置調用類ConstructorOne的構造函數? –

+0

這就是Java的製作過程。這不是我的錯。想想看。假設你正在擴展JFrame。如果構造函數未被調用,則可能不會發生一些關鍵的初始化過程。這就是爲什麼它必須被稱爲。 – Leonid

1

ConstructorOne中的默認構造函數調用​​,這是類ConstructorTwo中的默認構造函數。當調用方法或構造函數或通過封裝邊界訪問字段時,他們需要公開。

+0

第一個'ConstructorTwo'應該讀爲'ConstructorOne' –

+0

@CarlosHeuberger非常感謝。我糾正了我的錯誤。 –

0

ConstructorOne類有一個自動生成的公共構造函數,它不帶任何參數,並調用super()。實際上,這是:

public ConstructorOne() { 
    super(); 
} 

如果你不自己寫一個構造函數,所有的類都隱式地有這樣的構造函數。因此,需要有一個可用的構造函數來調用超類(在這種情況下,它必須是publicprotected,以便可以被另一個包中的子類訪問)。

+0

我明白,但爲什麼它會被調用呢?我根本沒有創建任何類ConstructorOne的對象,據我所知它不應該創建一個對象來調用靜態main()方法嗎? –

+0

如果你沒有調用它,無所謂。這是有效的,所以它必須遵守規則。沒有被調用的方法中的代碼問題仍然會導致編譯問題。 – khelwood

+0

你並沒有調用它,但編譯器應該如何知道這是否會永遠如此 - 這可能是一個庫或在其他地方使用。 –

0

當構造函數是公共的時候,任何人都可以調用它。當構造函數是私有的時,通常意味着你需要以其他方式構造對象,通常使用由作者爲此目的創建的另一個公共靜態方法。