在子类外部访问Java超类变量?

时间:2019-03-04 17:11:24

标签: java inheritance super

如果我有以下三个班级:

@win.event
def on_key_press(key, modifiers):
    if key == pyglet.window.key.UP:
        print("UP")

所以问题是我如何从一个单独的类中创建的新对象的超类中打印出0。 System.out.println(s.super.x);不起作用。我认为它不会改变任何东西,但我使用的是Java 8。

2 个答案:

答案 0 :(得分:0)

表达式s.super.x在这里无效。每当在super.x前面加上一些前缀时,它应该是类型名,而不是变量名,例如SuperClass.super.x。但是,这仅在用于访问封装类的超类的子类内部有效,该类在此处不存在。

x设为SuperClass,以便您可以访问x中声明的Superclass

System.out.println( ((SuperClass) s).x);

SuperClass sc = (SuperClass) s;
System.out.println(sc.x);

这有效,因为变量访问是静态绑定的。变量或表达式的类型决定了变量访问的搜索范围。

答案 1 :(得分:0)

TL; DR:如果您在子类中引入了新字段,请不要重复使用父类中的字段名称。您一无所获,只有困惑和问题。

如果我的理解正确,您希望SubClass实例具有两个字段,其中一个字段是从SuperClass继承的(为了便于讨论,我们将其重命名为superX以使情况更清楚),另一个来自子类本身(让我们将其重命名为subX)。

对于给定的SubClass实例,您希望能够访问superXsubX这两个字段(当然,使用不同的表达式)。在您的代码示例中使事情变得困难的是,您选择为它们赋予相同的名称x

因此,如果您确实希望实例包含两个字段,则建议重命名它们,这样就不必使用诸如强制转换为SuperClass之类的丑陋技巧。

public class SuperClass{
     protected int superX = 0;
}

public class SubClass extends SuperClass{
    protected int subX = 1;
}

但是,如果x代表相同的属性,并且对于父类和子类都具有相同的含义,只是具有不同的初始值,那么拥有两个不同的字段就没有意义,而您应该将代码更改为:

public class SuperClass{
     protected int x = 0;
}

public class SubClass extends SuperClass{
    // constructor initializes the x field with 1.
    public SubClass(){
        x = 1;
    }
}

当然,那么不可能从SubClass的单个实例中获得两个不同的值。