【问题标题】:Accessing private instance variable of inner class from outer class从外部类访问内部类的私有实例变量
【发布时间】:2013-09-20 11:12:50
【问题描述】:

为什么这段代码不起作用

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' 时,我收到一条错误消息,提示我在静态中使用内部类语境。 用其他方法做同样的事情没有错误。

【问题讨论】:

  • 在第二个代码中,您不是在静态上下文中访问内部类:您是从类BB 的方法访问它。这就是您没有收到该错误的原因。
  • 试试BB b=new BB(); A a = b.new A();
  • 你的嵌套类也应该是静态的。

标签: java private inner-classes


【解决方案1】:

私有类A就像一个实例成员,我们不能在静态方法中使用实例成员而不创建它的对象。所以首先我们需要外部类的对象,而不是使用实例内部类。下面的代码工作正常。

BB 级 { 私人A级 { 私人int x; }

public static void main(String[] args)
{
    BB bb = new BB();
    BB.A a = bb.new A();
    a.x = 100;
    System.out.println(a.x);
}

}

【讨论】:

    【解决方案2】:

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

    A a = new A();
    

    原因:你不能在没有封闭实例的情况下实例化一个内部类,这正是那行代码试图做的。你可以改写

    A a = (new BB()).new A();
    

    这将提供一个封闭的内联实例。然后您也可以访问私有字段。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多