2013-03-13 203 views
3

如果一個類是私人的,那麼構造函數也必須是私有的?私人類的構造函數是否必須是私有的?

+7

知道最好的辦法是你自己嘗試一下,看看.. :)順便說一句,頂級類的不能是私人只有內部類的罐頭。 :) – PermGenError 2013-03-13 09:15:17

+0

考慮一個私有類中的非私有構造函數,如何從另一個類訪問它? – 2013-03-13 09:16:10

+0

答案是**不是** – pktangyue 2013-03-13 09:16:42

回答

4

不,沒有這樣的限制。見JLS §8.8.3. Constructor Modifiers

值得指出的是,只有一個嵌套類可以被聲明爲private。 JLS允許這樣的類的構造函數使用任何有效的訪問修飾符。

3

如果你的意思是嵌套類,答案是不是。使內部類爲私人使它只能在外部類中使用。

編輯:看來外層類可以完全訪問內部類的內部,而不管它們的訪問修飾符如何。這使我的上述推理無效,但無論如何,沒有這種限制。奇怪的是,現在看來,如果內部類是private,它的構造函數是本質上是private,無論它的訪問修飾符如何,因爲沒人能調用它。

+1

你確定嗎?我做了幾個實驗,並且我可以從外部類創建一個內部類的實例,即使內部類的構造函數是'private' *。 – NPE 2013-03-13 09:22:09

+0

@NPE我打算基於邏輯,但看起來你是對的,它在[爲什麼外部Java類可以訪問內部類私有成員?](http://stackoverflow.com/q/1801718)接受的答案不幸倒退.. – 2013-03-13 09:28:37

+1

Java中的一個通用規則是,所有'private'成員都可以在它們出現的最外面的詞彙範圍內訪問。 – 2013-03-13 09:29:44

0

不,它沒有修復,你可以將它設置爲私人/公共/任何你想要的。

但是在某些情況下,如果您不想讓其他類創建此類的對象,我寧願將構造函數設爲私有。那麼在這種情況下,您可以通過將構造函數設置爲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; 
    } 
} 

順便說一句,這取決於您的要求。

0

它不是是私人的。但它可以。例如:

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(); 
} 

如果使用privatepublic構造私有內部類它不會有所作爲。原因是內部類實例是外部類實例的一部分。這張照片說明了一切:

Inner class is part of the outer class. That's why all private members of the inner class can be accessed from the outer class.

注意,我們談論的是內部類。如果嵌套類是static,官方術語是靜態嵌套類,它與內部類不同。只需調用new Outer.Inner()即可在沒有外部類實例的情況下訪問公共靜態嵌套類。有關內部類和嵌套類的更多信息,請參閱此處。 http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

1

不,它沒有。相反,如果使用外部類的私有構造函數(這是默認的私有類)創建內部類的實例,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