从超类访问阴影变量

时间:2017-12-29 05:09:03

标签: java inheritance shadow superclass

从这个anwser,他说我们可以通过转换awk从超类的超类访问阴影变量,但它不适用于方法调用,因为方法调用是根据运行时类型确定的对象。

但是,为什么我仍然可以在没有显式转换传递参数类型的情况下获得阴影变量?

this

产生输出:

interface I { int x = 0; }
class T1 implements I { int x = 1; }
class T2 extends T1 implements I { int x = 2; }
class T3 extends T2 implements I {
    int x = 3;

    void test() {
        System.out.println("((T3)this).x=" + ((T3)this).x + "; getT3(this)=" + getT3(this));
        System.out.println("((T2)this).x=" + ((T2)this).x + "; getT2(this)=" + getT2(this));
        System.out.println("((T1)this).x=" + ((T1)this).x + "; getT2(this)=" + getT1(this));
        System.out.println("((I)this).x=" + ((I)this).x + "; getI(this)=" + getI(this));
    }

    public static void main(String[] args) {
        new T3().test();
    }

    int getT3(T3 t3) { return t3.x; }
    int getT2(T2 t2) { return t2.x; }
    int getT1(T1 t1) { return t1.x; }
    int getI(I i) { return i.x; }
}

如果我理解他的回答是正确的,那么((T3) this).x = 3; getT3(this) = 3 ((T2) this).x = 2; getT2(this) = 2 ((T1) this).x = 1; getT1(this) = 1 ((I) this).x = 0; getI(this) = 0 getT3getT2getT1方法都不应该返回3吗?

1 个答案:

答案 0 :(得分:2)

由于方法签名需要IT1T2T3,因此在返回i.x,{{t1.x时,参数将被视为这些类型1}}等等。

所以调用getT2(this)基本上等同于调用getT2((T2) this)

这就是为什么他们不会全部返回3,而是该特定类型的x的值。

我不确定我是否已经很好地解释了这一点,但由于T3扩展了T2,因此在传递给T2时会隐式转换为getT2的实例