与私人构造函数混淆

时间:2014-06-30 16:49:42

标签: java java-ee

在java中研究过,如果一个类有私有构造函数,它不能被继承为super(),不能被调用,而不是为什么这个代码编译,如果是内部类:

public class TestMe2 { 
    class Singleton { 
        private Singleton() { 
        } 
    } 
    class BB extends Singleton {  
    } 

    public void callMe(){ 
        Singleton sing=new BB(); 
    } 
}

3 个答案:

答案 0 :(得分:2)

因为共同外部类的2个内部类可以访问它们各自的私有成员。

引自the JLS

  

私有类成员或构造函数只能在顶级类(第7.6节)的主体内访问,该类包含成员或构造函数的声明。

答案 1 :(得分:2)

private关键字限制您在同一文件中访问它所引用的构造函数/ fubction / variable。这意味着在内部类中,您实际上可以访问私有构造函数/方法/变量

要添加到我的答案中,如果您的BB位于不同的文件中,您将遇到问题,并且java编译器会要求您定义另一个非默认构造函数

编辑: 错误地提到“同一档案”。 private关键字限制访问包含成员或构造函数声明的顶级类(第7.6节)的主体内部

感谢@JB Niget

答案 2 :(得分:0)

BB是默认构造的。默认构造函数是package-privatea class's constructor will always call the superclass constructor。具体做法是:

  

如果您不自己明确地执行此操作,则无论构造函数是私有还是公共,都会为您插入隐式调用。

所以Singleton.Singleton仍然会被子类的构造函数调用。是的,与C ++相比,这并没有多大意义,其中private确实意味着private

您可以拨打BB.BB,因为您要从同一个套餐中调用它。