3
class Host {
    int x=2;

    class Helper {
        int x = 7;
    }

    public static void main(String[] args){
        Host ho = new Host();
        Helper he = ho.new Helper();
        System.out.println(ho.x);
        System.out.println(he.x);

    }
}

所以在这里我得到了预期的输出

2
7

现在我想问一下,比如说,我想访问ho's xfrom he

即我想要在这里2通过 Helper 对象打印我的东西he

System.out.println(???);

我知道这样的东西没有用,我只是想澄清一下我对嵌套类的概念。我认为这应该是可能的,因为 Helper 对象he有点“绑定”到 Host 对象ho。因为he没有ho. 从 Helper 类内部我可以做到System.out.println(Host.this.x);并且它有效。我无法弄清楚如何从 main 内部进行操作。

4

4 回答 4

1

回到过去,在旧版本的 Java 中,您使用this$0的是访问外部实例的方式,而不是Host.this. 规范已更改,但该字段仍可通过反射获得:

Field this$0 = he.getClass().getDeclaredField("this$0");
Host host = (Host) this$0.get(he);
System.out.println(host.x);

我不知道任何其他方式(除了修改Host类以添加getXgetHost方法)。

现在,为什么没有反射就不能访问?我可以看到两个可能的原因:

  • 他们忘记了
  • 这种来自实例外部的访问破坏了封装
于 2012-12-04T10:05:54.547 回答
1

正如其他答案已经指出的那样,您不能。原因在于JLS #15.8.3this中定义的方式

关键字 this 只能用在实例方法、实例初始化器或构造器的主体中,或者在类的实例变量的初始化器中。如果它出现在其他任何地方,则会发生编译时错误。

而且由于您只能使用this(cf JLS #15.8.4 ) 访问封闭实例,因此只能在内部类中完成:

C.this如果当前类不是 C 类或 C 本身的内部类,则[调用] 是编译时错误。

于 2012-12-04T10:24:04.997 回答
0

基本的 Java 概念,主机类可以访问内部类变量x,反之亦然。你可以像@Nikita Beloglazov 所说的那样做。但是直接使用变量,不可能

于 2012-12-04T09:59:32.467 回答
0

您可以在返回外部类的内部类中创建方法:

class Helper {
    int x = 7;

    public Host outer() {
        return Host.this;
    }
}

// In main;
System.out.println(he.outer().x);

它类似于访问x内部Helper ,但更通用。

于 2012-12-04T10:05:17.033 回答