如果我有以下三个班级:
@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。
答案 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
实例,您希望能够访问superX
和subX
这两个字段(当然,使用不同的表达式)。在您的代码示例中使事情变得困难的是,您选择为它们赋予相同的名称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
的单个实例中获得两个不同的值。