如何在超类的超类中引用阴影变量?

时间:2015-06-01 03:28:23

标签: java inheritance

这是一个简单的继承示例,其中有一个带阴影的变量x。

class A{
    int x=1;
}
class B extends A{
    int x=2;
}
class C extends B{
    int x=3;
    int y;
}

如何在C类中引用A类的阴影变量x?(我希望y=super.super.x;之类的东西运行良好。)

3 个答案:

答案 0 :(得分:2)

没有你想象的那么难。 (虽然我强烈建议避免这种情况,但如果你有一个继承自C的班级B,而班级A继承自班级x,所有这些班级都会实施公共字段{ {1}},然后使用super通常是错误的方法。

相反,给定课程C,请尝试以下方法:

((A)this).x;   //don't forget the parentheses!

这将为x提供A的价值。此外,

super.x == ((B)this).x;

这通常是为什么,对于单个步骤,我们通常只使用super

希望这有帮助。

答案 1 :(得分:2)

据我所知,没有办法以你想象的方式实现这一目标。您最好的选择是在班级B中实施一种访问方法:

class B extends A{
    int x=2;

    protected int getXFromA() {
        return super.x;
    }
}

通过这种方式,您可以从班级x访问班级A中定义的C的值。

但是,我对你的用例非常感兴趣。考虑到面向对象的设计,有什么理由可以直接从A访问C的成员?如果是这种情况,从OOP的角度来看,C实际上不再被视为B的正确子类。

答案 2 :(得分:1)

class A {
    int x = 1;
}
class B extends A {
    int x = 2;
}
class C extends B {
    int x = 3;
    int y = ((A) this).x;
}

请注意,由于可能造成混淆,通常不鼓励使用阴影。