他说,通过此anwser,我们可以通过强制转换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
如果我正确理解了他的答案,
getT3
,getT2
,getT1
和getI
方法是否都不应该全部返回3? 最佳答案
由于方法签名要求使用I
,T1
,T2
和T3
,因此在返回i.x
,t1.x
等时,会将参数视为这些类型。
因此,调用getT2(this)
本质上等同于调用getT2((T2) this)
。
这就是为什么它们不会全部返回3,而是该特定类型的x
值的原因。
我不确定我是否已经对此进行了很好的解释,但是由于T3
扩展了T2
,因此当传递给T2
时,它会隐式转换为getT2
的实例。