覆盖超类的实例变量
为什么我们不能覆盖子类中超类的实例变量?
因为如果你改变了数据成员的实现,它很可能会破坏超类(想象一下将超类的数据成员从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。