考虑以下计划:
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的对象?
答案 0 :(得分:4)
因为Top Level Class
是一个幸福的家庭,所以每个人都可以在private
之前互相访问。
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类的对象