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

Java 如何在具有私有构造函数的本地内部类的类之外创建实例?,java,inner-classes,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

考虑以下计划:

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的对象吗?

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

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


如果你把B班移到A班之外,它将按预期工作。

因为A
顶级班是一个幸福的家庭,每个人都可以互相接触,尽管
是私人的

6.6.1. 确定可访问性
  • 引用(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问且该成员或构造函数声明允许访问时才可访问:
    • 否则,如果该成员或构造函数被声明为
      私有
      ,则仅当且仅当它发生在包含该成员或构造函数声明的顶级类()的主体内时,才允许访问
请参阅:

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

实现这一点的方法是使用合成的包保护方法

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

你说的
具有私有构造函数的类意味着我们只能在类内部创建对象

但是
这是因为您在
main(String[]args)方法中定义了
内部类
,而不是在
顶级类中

如果你试试看

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的对象

private
的意思不仅仅是“类内”;它的意思是“在类及其封闭/同级类(如果有的话)”内。您不能,但原因不同:
无法访问类型a的封闭实例。必须使用类型A的封闭实例(例如x.new A(),其中x是A的实例)限定分配。
Try
new A().new B()或使
B
静态
.1。您缺少一个
在主方法之前。2.缺少
MyInterface
printInt
的返回类型。3.
mMember
是非静态的,因此
mMember.printInt()是不允许的。4。这是不允许的,因为
x
不是在
MyInterface
中声明的,而是在
ABC$1
中声明的。这与
private
无关。因此,更糟糕的是,您仍然可以通过反射访问
x
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");
    }
}