爲什麼Java不允許繼承其構造函數是私有的類的繼承?爲什麼你不能從一個構造函數是私有的類繼承?
回答
Java不禁止用私有構造函數對類進行子分類。
public class Main {
static class A {
private A() {
System.out.println("Subclassed A in "+getClass().getName());
}
}
static class B extends A {
public B() {
}
}
public static void main(String... ignored) {
new B();
}
}
打印
Subclassed A in Main$B
什麼它阻止是不能訪問其超類的任何構造子類。這意味着一個私有構造函數不能在另一個類文件中使用,並且一個包本地構造函數不能在另一個包中使用。
在這種情況下,您唯一的選擇就是委派。您需要調用工廠方法來創建「超級」類的實例幷包裝它。
因爲一個類必須調用它的超類構造函數總是。如果超類構造函數不能被訪問,那麼子類就不能被初始化。
更多信息:JLS 8.8.10. Preventing Instantiation of a Class
關於布萊恩·羅奇的評論:
調用[父類的構造函數]只是,如果你不這樣做明確的暗示和家長有一個公共或受保護的無參數構造函數(或者沒有定義任何情況下有一個默認的無參數)。這是必需的,因爲......這就是語言的工作原理。兒童[班級]必須致電父母的建設者。
注意,當你在Java中實例化任何類,總有到Object
構造一個隱式調用,因爲它是超類的所有類的。從JLS鏈接
public Object() {
}
注:這將執行其default constructor
這是一個編譯時錯誤,如果默認的構造函數是隱式聲明但超類沒有可訪問的構造 (第6.6節),不帶任何參數,也沒有引發子句。
如果一個類的構造函數是私有的,那麼子類不能調用超級構造函數。 因此繼承會失敗。
是的,在Luiggi的答案中增加了一些東西,這個特性在創建Singleton類時使用了,這個類只允許創建一個類的實例。
如果您正確創建單身人士,則不需要。 –
@布賴恩可以請你告訴我如何正確地做到這一點,而不使構造函數是私人的? –
Josh Bloch,'Effective Java second edition' - 使用'enum'。請參閱:http://stackoverflow.com/questions/5759596/the-best-singleton-pattern-since-java-5。如果你沒有那本書,就買它。這是一個必須閱讀的人認真對待java –
如果你有一個子類,你有2個子類(子類)構造函數的可能性: 1.默認構造函數(無參數構造函數):在這種情況下,默認構造函數會自動嘗試調用父類構造函數:因爲父類的構造函數是私有的。 2。參數化構造函數:當您嘗試爲具有參數化構造函數的子類創建對象時,需要通過傳遞參數或不傳遞參數,從子類構造函數強制調用父類構造函數:由於父構造函數是私有的,因此也會失敗。
由於子類將具有默認構造函數或參數化構造函數,並且它們不能具有其中的任何一個,所以不能爲具有私有構造函數的父類使用子類。
- 1. 使用私有構造函數繼承一個類
- 2. 私有構造函數和繼承(Java)
- 3. 爲什麼從繼承類調用基類構造函數
- 4. 爲什麼從具有私有構造函數的類繼承是不允許的
- 5. 從C++中的私有模板類繼承構造函數
- 6. 爲什麼不繼承java類構造函數呢?
- 7. 爲什麼我不能從私有類/接口繼承?
- 8. 爲什麼有一個私有構造
- 9. 從超類繼承構造函數?
- 10. 從基類繼承構造函數?
- 11. 爲什麼一類從結構繼承
- 12. 爲什麼從Base繼承的SQLAlchemy類不需要構造函數?
- 13. Object.create而不是構造函數繼承
- 14. 具有不一致構造函數的多級別類繼承
- 15. 爲什麼我們需要一個私有構造函數?
- 16. 從類繼承的類沒有默認的構造函數
- 17. DRY JavaScript的繼承順序是從在一個構造函數
- 18. 爲什麼一個結構允許接口繼承,爲什麼一個類不能繼承
- 19. 爲什麼具有繼承構造函數的類還會獲得合成的默認構造函數?
- 20. Scala案例類私有構造函數不是私有的
- 21. 類的繼承和構造函數
- 22. 繼承類中的構造函數C++
- 23. 繼承虛基類的構造函數
- 24. C++繼承類的構造函數
- 25. 爲什麼我不能在一個C++類中聲明一個空的構造函數,該類使用一個私有構造函數來擴展
- 26. 爲什麼不是一個私人的無參數構造函數?
- 27. 使用私有繼承時繼承基礎構造函數的方法?
- 28. 爲什麼我不能繼承虛擬基礎的構造函數?
- 29. UML - 類繼承,你繼承了什麼?
- 30. 什麼是「可繼承的替代構造函數」?
@HovercraftFullOfEels,請參閱Peter Lawrey的答案。 – CodeBlue