3

考虑以下程序:

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

4 回答 4

4

因为aTop Level Class是一个幸福的家庭,尽管如此,每个人都可以互相访问private

JLS 6.6.1

6.6.1. 确定可访问性

  • 引用(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问且声明成员或构造函数允许访问时才可访问:
    • 否则,如果声明了成员或构造函数private,则当且仅当它发生在包含成员或构造函数的声明的顶级类(第 7.6 节)的主体内时,才允许访问。
于 2013-06-16T12:00:09.733 回答
1

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

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

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

于 2013-06-16T11:59:59.063 回答
1

请参阅JLS 6.6.1

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

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

“如果你想隐藏你的内部类的私有成员,你可以定义一个与公共成员的接口,并创建一个实现这个接口的匿名内部类。参考这段代码:”

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
 }
} 
于 2013-06-16T12:02:45.327 回答
0

你说
A class having private constructor means we can create object inside the class only
但那
是因为你定义了你的inner Classin main(String[] args) methodNot inTop 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 类的对象

于 2013-06-16T12:05:32.083 回答