覆盖超类的实例变量

时间:2009-01-09 11:32:55

标签: java inheritance

为什么我们无法覆盖子类中超类的实例变量?

9 个答案:

答案 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.