在 (*) 中可以访问多少个不同版本的 'x'?

How many different versions of 'x' are accessible in (*)?

这是了解 Java 内部 类 工作原理的训练练习。如问题所述,在 (*) 中可以访问多少个不同版本的 x

class Outer {
    int x;

    class Inner extends Outer {
        int x;

        void f(int x) {
            (*)
        }
    }
}

我倾向于认为有 3 个,即:this.xsuper.xx 但我的一些同行似乎认为有 4 个。

我们谁迷茫了?你能解释一下吗?

有四个:

  • Outer.this.xOuter class 属性
  • this.xInner class 属性
  • super.x 对于超类型 Outer class 属性
  • x 方法参数

有4个,分别是:xthis.xsuper.xOuter.this.x

考虑以下几点:

public class Outer {

    int x;

    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        outer.x = 3;
        inner.x = 2;
        inner.f(1);
    }

    class Inner extends Outer {
        int x;

        void f(int x) {
            System.out.println(super.x);
            System.out.println(x);
            System.out.println(this.x);
            System.out.println(Outer.this.x);
        }
    }

}

此代码将打印

0
1
2
3

显示 4 个不同的值。

发生的情况如下:

  1. inner 实例的父级有一个未初始化的 x 变量。对于 int,默认值为 0:这是 super.x
  2. 使用参数 1 调用方法 f:这是 x
  3. 实例 inner 已将其 x 设置为 2 inner.x = 2:这是 this.x
  4. outer 实例,即 Outer.this 已将其 x 值设置为 3:这是 Outer.this.x

这里的技巧是 Inner 都是一个 inner class (so it has an enclosing Outer instance) and a subclass (所以它有一个父 Outer 实例),而这两个 Outer 实例是不一样的.