2 回答
TA贡献1802条经验 获得超4个赞
如果您在子类中引入新字段,请不要重复使用父类中的字段名称。你一无所获,只有困惑和问题。
如果我理解正确,您希望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.
TA贡献1836条经验 获得超13个赞
表达式s.super.x在这里无效。每当你在 a 前面super.x加上一些东西时,它应该是一个类型名,而不是一个变量名,例如SuperClass.super.x. 但是,这仅在用于访问封闭类的超类的子类内部有效,此处不存在。
转换x为 aSuperClass以便您可以访问x声明的 in Superclass。
System.out.println( ((SuperClass) s).x);
或者
SuperClass sc = (SuperClass) s;
System.out.println(sc.x);
这是有效的,因为变量访问是静态绑定的。变量或表达式的类型决定了搜索变量访问的范围。
添加回答
举报