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

2022-09-01 17:15:32

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

class Outer {
    int x;

    class Inner extends Outer {
        int x;

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

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

我们谁感到困惑?你能解释一下吗?


答案 1

有 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. 实例的父级具有单元化变量。对于 ,默认值为 0:这是 。innerxintsuper.x
  2. 该方法用参数调用:这是 。f1x
  3. 该实例设置为 2,并带有 :这是 。innerxinner.x = 2this.x
  4. 该实例的值设置为 3:这是 。outerOuter.thisxOuter.this.x

这里的诀窍是,它既是一个内部类(所以它有一个封闭的实例)又是一个子类(所以它有一个父实例),而这两个实例是不一样的。InnerOuterOuterOuter


答案 2

其中有四个:

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

推荐