2017-04-24 22 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体内允许

相关问题