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

时间:2016-01-12 23:04:57

标签: java inner-classes

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

class Outer {
    int x;

    class Inner extends Outer {
        int x;

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

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

我们哪个人感到困惑?你能解释一下吗?

2 个答案:

答案 0 :(得分:30)

有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. 使用参数f调用方法1:这是x
  3. 实例inner已将x设置为2 inner.x = 2:这是this.x
  4. outer实例Outer.this已将x值设置为3:这是Outer.this.x
  5. 这里的诀窍是Inner既是inner class(所以它有一个封闭的Outer实例)和subclass(所以它有一个父Outer这两个Outer个实例并不相同。

答案 1 :(得分:11)

其中有四个:

    {li> Outer.this.x代表Outer类属性 {li> this.x代表Inner类属性
  • super.x表示超类型Outer类属性
  • x用于方法参数