2017-04-24 20 views
1

已知私有構造函數阻止在類之外創建實例。他們還說,它不允許打電話給超級玩家,因此它可以防止高速行駛。但是......現在看來似乎我可以創建多個實例,並可以調用(或什麼是錯?):我不明白私人構造函數如何不能創建外部實例並防止子類化(儘管他這麼做了!)

public class TestPrivate { 

    private static int i; 

    class A { 
     private String s = "Constructor "; 
     private A() { 
      print(); 
     } 
     void print() { 
      s += getClass().getSimpleName() + " " + ++i; 
      System.out.println(s); } 
    } 

    class B extends A { 

     B() { 
      super(); // <--- i can call super 
      super.print(); 
     } 
    } 

    public static void main(String[] args) { 

     TestPrivate test = new TestPrivate(); 
     // creating multiple objects with private constructors 
     test.new A(); 
     test.new A(); // <--- i can call constructor outsised the class many times 

     test.new B(); 
    } 
} 

輸出: 構造A 1 構造A 2 構造函數b 3分配 構造乙3B 4

+4

爲'A'和'B'類創建不同的文件,私人不阻止像這樣的內部類訪問 – AxelH

+1

同一個外部類中的類可以訪問私有成員。假設如果你這樣做了,你就知道你在做什麼,而你的左手並沒有試圖阻止你的右手進行編碼。 –

回答

2

private訪問方式,可以訪問整個Class。由於B類A類內,B類將被視爲類的成員,並且如果有一個look at docs可以自由地訪問的A

構造中,清楚地提及。

嵌套類是其封閉類的成員。即使它們被聲明爲私有,非靜態嵌套類(內部類)也可以訪問封閉類的其他成員,即

+1

我正在查看** Controlling Access to Member of a Class **頁面中的信息。這解釋了爲什麼我找不到證明我的觀點的事情。 – AxelH

1

您在main方法做test.new A();同一個類/文件(TestPrivate類),沒有理由你就不能訪問所有的方法,包括私營者的內部....

2

您正在使用內部類。這意味着AB都是TestPrivate的成員。

JLS的說(當成員或構造被聲明private):當且僅當頂層類的主體內發生時(第7.6節),其包圍的聲明

訪問被許可成員或構造函數。

所以,私有成員和任何成員的私人構造任何訪問的TestPrivate體內允許

相關問題