覆盖超类的实例变量

War*_*ior 27 java inheritance

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

Pie*_*e D 49

他或许打算尝试覆盖用于初始化变量的值.例如,

而不是这(这是非法的)

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";
    // ...
}
Run Code Online (Sandbox Code Playgroud)

人们应该这样做

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";
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,如果你在超类`abstract`中创建`getHelp()`方法,你可以强制子类为它提供一个实现,而不是希望它们覆盖它. (6认同)

cle*_*tus 21

因为如果你改变了数据成员的实现,它很可能会破坏超类(想象一下将超类的数据成员从float更改为String).


Adr*_*scu 9

因为您只能覆盖行为而不是结构.一旦创建了一个对象并为其分配了内存,就会将结构设置在一起.当然,这在静态类型语言中通常是正确的.


Jon*_*eet 5

变量不是多态访问的.对于受保护变量无法做到的事情,您想要做什么?(并不是说我个人鼓励使用非私有的可变变量.)