如何在具有私有构造函数的本地内部类的外部创建实例?

时间:2013-06-16 11:50:32

标签: java inner-classes

考虑以下计划:

public class A
{
    public static void main(String[] args)
    {
        class B
        {
            private B()
            {
                System.out.println("local");
            }
        }
    // how are we able to create the object of the class having private constructor
    // of this class.
    B b1= new B();
    System.out.println("main");
    }
}

输出: 本地 主

具有私有构造函数的类意味着我们只能在类中创建对象,但是这里可以在类之外创建实例。有谁可以解释我们如何能够在B类之外创建B的对象?

4 个答案:

答案 0 :(得分:4)

因为Top Level Class是一个幸福的家庭,所以每个人都可以在private之前互相访问。

JLS 6.6.1

  

6.6.1。确定可访问性

     
      
  • 只有在可访问类型且声明成员或构造函数时,才能访问引用(类,接口或数组)类型的成员(类,接口,字段或方法)或类类型的构造函数。允许访问:   
        
    • 否则,如果成员或构造函数声明为private,则当且仅当它发生在包含成员声明的顶级类(§7.6)的主体内时才允许访问或构造函数。
    •   
  •   

答案 1 :(得分:1)

你甚至可以访问该类的私有变量(试试吧!)。

这是因为您在调用它的同一个类中定义了该类,因此您对该类具有私有/内部知识。

如果您将B类移到A类之外,它将按预期工作。

答案 2 :(得分:1)

参考JLS 6.6.1

  

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

实现它的方法是使用合成的包保护方法。

“如果您想隐藏内部类的私有成员,可以使用公共成员定义一个接口,并创建一个实现此接口的匿名内部类。请参阅this代码:”

class ABC{
private interface MyInterface{
    public void printInt();
}

 private static MyInterface mMember = new MyInterface(){
 private int x=10;

    public void printInt(){
    System.out.println(String.valueOf(x));
 }
};

 public static void main(String... args){
   System.out.println("Hello :: "+mMember.x); ///not allowed
   mMember.printInt(); // allowed
 }
} 

答案 3 :(得分:0)

你说的是 A class having private constructor means we can create object inside the class only

那是因为你在inner Class中定义了main(String[] args) method而不是Top Level Class

如果您尝试

public class A {

    class B {
        private B() {
            System.out.println("local");
        }
    }

    public static void main(String[] args) {

        B b1 = new B(); // you cant create object of inner Class B
        System.out.println("main");
    }
}

然后你无法创建内部B类的对象