通过main中的内部类对象访问外部类变量

时间:2012-12-04 09:54:46

标签: java nested-class

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并且它可以工作。我无法弄清楚如何从主内部做到这一点。

4 个答案:

答案 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类以添加getXgetHost方法)。

现在,为什么没有反思可以获得此访问权限?我可以看到两个可能的原因:

  • 他们忘记了
  • 来自实例外部的这种访问打破了封装

答案 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,但更为一般。