簡體   English   中英

Java公共類,帶有帶有非公共參數的公共構造函數。 為什么?

[英]Java public class with public constructor with non-public parameter. Why?

Java允許定義以下一對類。

class Class1 { ... }
public Class2 { public Class2(Class1 c1) { ... } }

如果由於無法訪問Class1而無法實例化它,為什么Class2具有公共構造函數?

出於記錄,沒有從Class1繼承的公共類。

Class1Class2在同一包中定義。 這樣它們就可以訪問了。 Class1具有默認的訪問修飾符,該修飾符對於同一包中的所有類均可見

乍一看,這似乎沒有任何意義:此軟件包的用戶可以訪問Class2。 但是他無法創建Class2的實例,因為他無權訪問Class1。 因此,沒有理由使得構造的public ,當它需要的參數是不public為好。

實際上唯一有意義的情況是,同一包中有另一個擴展Class1的public類。 然后,您可以創建此類的實例,並將其傳遞給構造函數:

// Assuming this class extends Class1, and it is public, you 
// can create an instance of this class from outside the package:
ExtendedClass1 e = new ExtendedClass1(); 

// This is using the public constructor that expects a Class1.
// Although Class1 itself is NOT public, this constructor 
// can be called with an instance of a (public) class that
// extends Class1
Class2 c = new Class2(e); 

但是由於在問題中排除了后者,因此沒有理由擁有這個公共構造函數。

合理的做法是,將一個類限制其對同一包成員的創建/訪問,以使同一包中的其他類可以擴展該類並公開。

例如,如果您正在實施Template模式,則您可能具有超類(可能是抽象的),該超類實現了基礎,共享,邏輯,並帶有一個或多個實現了不同步驟的具體類。

然后,調用者可以實例化這些具體的類,而基類則不能。

可以爭論的是,盡管可以保護基類而不是包范圍。

每個類都有一個默認的構造函數(如果不提供),則可以執行以下操作:

Class1 c1 = new Class1();

然后

Class2 c2 = new Class2(c1);

暫無
暫無

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

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