Java 从外部类访问内部类的私有实例变量

Java 从外部类访问内部类的私有实例变量,java,private,inner-classes,Java,Private,Inner Classes,为什么这个代码不起作用 public class BB { private class A { private int x; } public static void main(String[] args) { A a = new A(); a.x = 100; System.out.println(a.x); } } 当这个代码工作时 public class BB {

为什么这个代码不起作用

public class BB
{
    private class A
    {
        private int x;
    }

    public static void main(String[] args)
    {
        A a = new A();
        a.x = 100;
        System.out.println(a.x);
    }
}
当这个代码工作时

public class BB
{
    private class A
    {
        private int x;
    }

    static int y = 3;

    public static void main(String[] args)
    {
        BB b = new BB();
        b.compile();
        System.out.println("y = "+ y);
    }
    public void compile()
    {
        A a = new A();
        a.x = 100;
        System.out.println(a.x);
        System.out.println("y = "+ y);
    }
}
在第一段代码中,当我试图通过内部类“A”的对象引用内部类“A”的实例变量“x”时,我得到一个错误,表示我正在静态上下文中使用内部类。
在其他方法中执行相同操作时没有错误。

您的错误与字段访问无关。此行的编译失败:

A a = new A();
原因:在没有封闭实例的情况下不能实例化内部类,这正是该行代码试图做的。你可以改写

A a = (new BB()).new A();
它将提供一个内联的封闭实例。然后您也可以访问私有字段


或者,只需将A类设为静态,这意味着它没有封闭的实例。

私有类A类似于实例成员,我们不能在静态方法中使用实例成员而不设置其对象。所以首先我们需要使用外部类的对象,而不是内部类的实例。下面的代码运行良好

BB类 { 私人甲级 { 私人INTX; }


}

在第二段代码中,您不是在静态上下文中访问内部类:您是从类BB的方法访问它。这就是为什么你没有得到那个错误;A=b.新的A;嵌套类也应该是静态的。
public static void main(String[] args)
{
    BB bb = new BB();
    BB.A a = bb.new A();
    a.x = 100;
    System.out.println(a.x);
}