繁体   English   中英

覆盖超类的实例变量

[英]Overriding a super class's instance variables

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

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

而不是这(这是非法的)

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

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

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

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

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”这是如何覆盖超类的变量。

你可以覆盖一个方法,这是可以的,但你是什么意思覆盖一个变量? 如果你想在任何其他地方使用变量而不是超类你可以使用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。

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

你怎么用这个表达式做的

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM