[英]Is it possible to access private variable inside a class having private constructor and change final variable value from another class
[英]What is the difference between having a class as final and having a class constructor as private
最終類和將類構造函數作為私有類之間的區別究竟是什么。
我知道兩者都不能被分類(如果我錯了,請糾正我)。 他們有什么不同嗎?
最后一堂課不能延期。 它阻止了這一點
final class FinalClass {
}
// and later
class ExtendedClass extends FinalClass { // ERROR
}
這對像String這樣的東西很有用 - 你不希望有人能夠覆蓋String的邏輯,這是最常用的對象之一,並且能夠,哦,我不知道,添加網絡並發送所有你使用的字符串。 如果可以擴展String,則可以執行此操作。
私有構造函數不能在類外部調用。
class PrivateCons {
private PrivateCons() {
}
}
// later
PrivateCons pc = new PrivateCons(); // ERROR
通常這最終會像這樣工作:( java.lang.Math是一個很好的例子)
class FuncLib {
private FuncLib() { } // prevent instantiation
public static void someFunc(...) { }
public static int anotherFunc(...) { }
}
或者它最終像這樣工作//整數實際上是這樣做的
class VerySpecial {
private static Map<String,VerySpecial> cache;
public static VerySpecial generate(String data) {
VerySpecial result = cache.get(data);
if(result == null) {
result = new VerySpecial(data);
cache.put(data,result);
}
return result;
}
private String data;
private VerySpecial() { }
private VerySpecial(String data) { this.data = data}
}
擴展類時,默認情況下構造函數會嘗試調用默認(無參數)構造函數。 如果它是私有的,那么在擴展它時必須顯式調用非私有構造函數。 如果您沒有非私有構造函數來調用,則無法擴展它。 感謝您發表評論。 :-)
看看它有一個私有構造函數的Math類,無法實例化它有很多非常有用的靜態方法
只擁有私人建設者比擁有最終階級更強大。
詳細說明:在類A中只有私有構造函數會強烈影響對象的創建。 通常,您使用的是工廠方法。 您仍然可以使用技巧(例如clone()或反射調用私有構造函數)在沒有工廠方法的情況下創建A的實例。 但子類化是不可能的 ,因為子類的構造函數需要能夠調用super()
。 這只能在A內的嵌套類中實現。
只有私有構造函數通常是有意義的,例如通過工廠方法控制實例化,例如對於singeltons(參見Effective Java item 3)。 但即使在這種情況下,我也沒有理由不編寫“最終類”,如果只是為了文檔,那么讀者會立即意識到不允許繼承子類。
如果您不希望您的班級被分類,那么您使用final。 如果您不希望其他類實例化您的類,而是希望控制對象的構造和維護方式,則使用私有構造函數。
最終的類/方法永遠不會被繼承/重寫,並且會拋出編譯錯誤,因為具有私有構造函數的類也將拋出“沒有默認構造函數可用於您的類”的編譯,並且一旦你添加了非最終構造函數並調用它來自你的孩子班,沒有錯誤。
私有構造函數在創建單例類(僅存在一個類的實例)的情況下非常有用,其中您將構造函數設置為私有,並使用變量來存儲單個實例,這將使用公共靜態方法公開。 對於前
public class Singleton{
private static final Singleton instance = new Singleton();
//private constructor to avoid client applications to use constructor
private Singleton(){}
public static Singleton getInstance(){
return instance;
}}
例如,java中的String類是最終類。
private
成員可以通過內部類訪問。
public class Outer {
private Outer() {
System.out.println("Outer()");
}
static class Inner extends Outer {
{
System.out.println("Inner()");
}
}
public static void main(String... args) {
new Inner();
}
}
版畫
Outer()
Inner()
最終的類不能擴展,但它的構造函數可以是公共的。 私有構造函數可以從另一個構造函數調用或由內部類使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.