如果一個類是私人的,那麼構造函數也必須是私有的?私人類的構造函數是否必須是私有的?
回答
不,沒有這樣的限制。見JLS §8.8.3. Constructor Modifiers。
值得指出的是,只有一個嵌套類可以被聲明爲private
。 JLS允許這樣的類的構造函數使用任何有效的訪問修飾符。
如果你的意思是嵌套類,答案是不是。使內部類爲私人使它只能在外部類中使用。
編輯:看來外層類可以完全訪問內部類的內部,而不管它們的訪問修飾符如何。這使我的上述推理無效,但無論如何,沒有這種限制。奇怪的是,現在看來,如果內部類是private
,它的構造函數是本質上是private
,無論它的訪問修飾符如何,因爲沒人能調用它。
你確定嗎?我做了幾個實驗,並且我可以從外部類創建一個內部類的實例,即使內部類的構造函數是'private' *。 – NPE 2013-03-13 09:22:09
@NPE我打算基於邏輯,但看起來你是對的,它在[爲什麼外部Java類可以訪問內部類私有成員?](http://stackoverflow.com/q/1801718)接受的答案不幸倒退.. – 2013-03-13 09:28:37
Java中的一個通用規則是,所有'private'成員都可以在它們出現的最外面的詞彙範圍內訪問。 – 2013-03-13 09:29:44
不,它沒有修復,你可以將它設置爲私人/公共/任何你想要的。
但是在某些情況下,如果您不想讓其他類創建此類的對象,我寧願將構造函數設爲私有。那麼在這種情況下,您可以通過將構造函數設置爲private來做這樣的事情。
private class TestClass{
private TestClass testClass=null;
private TestClass(){
//can not accessed from out side
// so out side classes can not create object
// of this class
}
public TestClass getInstance(){
//do some code here to
// or if you want to allow only one instance of this class to be created and used
// then you can do this
if(testClass==null)
testClass = new TestClass();
return testClass;
}
}
順便說一句,這取決於您的要求。
它不是有是私人的。但它可以。例如:
public class Outer {
// inner class with private constructor
private class Inner {
private Inner() {
super();
}
}
// this works even though the constructor is private.
// We are in the scope of an instance of Outer
Inner i = new Inner();
// let's try from a static method
// we are not in the scope of an instance of Outer
public static void main(String[] args) {
// this will NOT work, "need to have Inner instance"
Inner inner1 = new Inner();
// this WILL work
Inner inner2 = new Outer().new Inner();
}
}
// scope of another class
class Other {
// this will NOT work, "Inner not known"
Inner inner = new Outer().new Inner();
}
如果使用private
或public
構造私有內部類它不會有所作爲。原因是內部類實例是外部類實例的一部分。這張照片說明了一切:
注意,我們談論的是內部類。如果嵌套類是static
,官方術語是靜態嵌套類,它與內部類不同。只需調用new Outer.Inner()
即可在沒有外部類實例的情況下訪問公共靜態嵌套類。有關內部類和嵌套類的更多信息,請參閱此處。 http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
不,它沒有。相反,如果使用外部類的私有構造函數(這是默認的私有類)創建內部類的實例,Java將創建一個額外的類來防止訪問衝突並保持JVM的快樂
如果你編譯此類
class Test {
private class Test2 {
Test2() {
}
}
Test() {
new Test2();
}
}
javac將創建Test.class,Test @ Test2。類
,如果你編譯這個類
class Test {
private class Test2 {
}
Test() {
new Test2();
}
}
的javac將創建的Test.class,[email protected],測試$ 1.class
- 1. 必須刪除一個構造函數是否是私有的?
- 2. Scala案例類私有構造函數不是私有的
- 3. @Singleton類我必須使構造函數私有
- 4. 構造函數是私有的?
- 5. CallInst構造函數是私有的?
- 6. 私人類構造函數不能訪問私人成員
- 7. 錯誤:構造函數是私有
- 8. 私人構造函數或私有函數?
- 9. KScenemer在Lucene有私人構造函數
- 10. 定義私有類的構造函數
- 11. 如何從多個私人構造函數中反映私人構造函數
- 12. 構造函數的私人範圍
- 13. C++私人構造類
- 14. 如何讓類構造函數在Ruby中是私有的?
- 15. 使類構造函數私有
- 16. JsonSerializationException類型與私有構造函數
- 17. 在java中,如何使用其父類也有私有構造函數的私有構造函數創建類?
- 18. 嘲笑私人構造函數
- 19. Ninject和私人構造函數
- 20. 私人WCF服務構造函數
- 21. 私人拷貝構造函數:disallow
- 22. Xposed - 掛鉤私人構造函數
- 23. 「私人」不是不是真的私人?
- 24. 使實體的構造函數私有
- 25. 是一個私人移動構造函數來防止移動?
- 26. 類的私人構造延伸
- 27. 我是否必須爲類的所有私有方法聲明一個類別?
- 28. 私有構造
- 29. 私有構造
- 30. Java:爲什麼單獨的類必須是私有的
知道最好的辦法是你自己嘗試一下,看看.. :)順便說一句,頂級類的不能是私人只有內部類的罐頭。 :) – PermGenError 2013-03-13 09:15:17
考慮一個私有類中的非私有構造函數,如何從另一個類訪問它? – 2013-03-13 09:16:10
答案是**不是** – pktangyue 2013-03-13 09:16:42