覆盖超类的实例变量

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

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

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

而不是这(这是非法的)

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"; // ... } 

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

变量不是多态访问的。 你想用保护变量做什么,你想做什么? (并不是说我个人鼓励使用非私有的可变变量。)

 class Dad{ public String name = "Dad"; } class Son extends Dad{ public String name = "Son"; public String getName(){ return this.name; } } 

如果你打电话,从main()方法

 new Son().getName(); 

将返回“Son”这是如何覆盖超类的变量。

你的意思是覆盖你想改变数据类型吗?

你用这个表达做什么

 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 ++表达式。

如果您需要覆盖实例变量,那么您几乎肯定会inheritance自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级(因为你看到脏编程会引发更多的脏程序)。

最好的解决方案是找到变量的另一个名称。

你可以覆盖一个方法,这是可以的,但你是什么意思覆盖一个变量? 如果你想在任何其他地方使用变量而不是超级类,你可以使用super。 如在超级(变量名称); 为什么要覆盖变量? 我的意思是有什么需要吗?

我们不能覆盖实例变量的结构,但我们会改变它们的行为: –

 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。