为什么我们无法覆盖子类中超类的实例变量?
答案 0 :(得分:48)
他或许打算尝试覆盖用于初始化变量的值。 例如,
public abstract class A {
String help = "**no help defined -- somebody should change that***";
// ...
}
// ...
public class B extends A {
// ILLEGAL
@Override
String help = "some fancy help message for B";
// ...
}
public abstract class A {
public String getHelp() {
return "**no help defined -- somebody should change that***";
}
// ...
}
// ...
public class B extends A {
@Override
public String getHelp() {
return "some fancy help message for B";
// ...
}
答案 1 :(得分:21)
因为如果你改变了数据成员的实现,它很可能会破坏超类(想象一下将超类的数据成员从float更改为String)。
答案 2 :(得分:9)
因为您只能覆盖行为而不是结构。一旦创建了一个对象并为其分配了内存,就会将结构设置在一起。当然,在静态类型语言中通常也是如此。
答案 3 :(得分:5)
不会以多态方式访问变量。对于受保护变量无法做到的事情,您想要做什么? (并不是说我个人鼓励使用非私有的可变变量。)
答案 4 :(得分:2)
class Dad{
public String name = "Dad";
}
class Son extends Dad{
public String name = "Son";
public String getName(){
return this.name;
}
}
如果您致电
,请从main()方法new Son().getName();
将返回“儿子” 这就是你可以覆盖超类变量的方法。
答案 5 :(得分:0)
你的意思是覆盖你想改变数据类型吗?
你对这个表达做什么
public class A {
protected int mIndex;
public void counter(){
mIndex++;
}
}
public class B extends A {
protected String mIndex; // Or what you mean with overloading
}
如何在没有运算符重载或类似的情况下更改mIndex ++表达式。
答案 6 :(得分:0)
如果你需要覆盖一个实例变量,你几乎肯定会从worng类继承。
在某些语言中,您可以通过提供新的实例来隐藏实例变量:
class A has variable V1 of type X;
class B inherits from A, but reintroduces V1 of type Y.
A类的方法仍然可以访问原始的V1。 B类的方法可以访问新的V1。如果他们想要访问原作,他们可以将自己投入到A级(因为你看到脏编程会引发更多肮脏的程序)。
最佳解决方案是为变量找到另一个名称。
答案 7 :(得分:0)
你可以覆盖一个方法,这是可以的 但重写变量是什么意思? 如果你想在任何其他地方使用变量而不是超类 你可以使用超级。 如在 超级(变量名称); 为什么要覆盖变量? 我的意思是有需要吗?
答案 8 :(得分:0)
我们不能覆盖实例变量的结构,但我们会覆盖它们的行为: -
class A
{
int x = 5;
}
class B extends A
{
int x = 7:
}
class Main
{
public static void main(String dh[])
{
A obj = new B();
System.out.println(obj.x);
}
}
在这种情况下输出为5.