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
访问x
的{{1}}。
即。我想在这里通过Helper对象he
打印2
:
he
我知道没有使用这样的东西,我只是想澄清我的嵌套类的概念。
我认为这应该是可能的,因为Helper对象System.out.println(???);
与Host对象he
有一定的“绑定”。如果没有ho
,则无法he
。从Helper类里面我可以做ho
并且它可以工作。我无法弄清楚如何从主内部做到这一点。
答案 0 :(得分: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
类以添加getX
或getHost
方法)。
现在,为什么没有反思可以获得此访问权限?我可以看到两个可能的原因:
答案 1 :(得分:1)
正如其他答案已经指出的那样,你不能。原因在于JLS #15.8.3
中this
的定义方式
关键字this只能在实例方法,实例初始化程序或构造函数的主体中使用,或者在类的实例变量的初始化程序中使用。 如果出现在其他任何地方,则会发生编译时错误。
由于您只能使用this
(cf JLS #15.8.4)访问封闭实例,因此只能在内部类中完成:
如果当前类不是C类或C本身的内部类,则编译时错误[调用
C.this
]。
答案 2 :(得分:0)
基本Java概念,Host类可以访问内部类变量x
,反之亦然。你可以像@Nikita Beloglazov所说的那样做。但是直接使用变量,不可能
答案 3 :(得分:0)
您可以在内部类中创建返回外部类的方法:
class Helper {
int x = 7;
public Host outer() {
return Host.this;
}
}
// In main;
System.out.println(he.outer().x);
类似于访问x
内的Helper
,但更为一般。