Java继承奇怪的行为

时间:2018-10-12 13:21:01

标签: java oop inheritance

以下代码将输出打印为40而不是30。我无法找出解决方案。请提供代码帮助。

class Base {

  int value = 0;

    Base() {
      addValue();
    }

    void addValue() {
      value += 10;
    }

    int getValue() {
      return value;
    }
}

class Derived extends Base {

  Derived() {
    addValue();
  }

  void addValue() {
    value +=  20;
  }
}

public class Test{

  public static void main(String[] args) {
    Base b = new Derived();
    System.out.println(b.getValue());
  }
}

Derived构造函数中的隐式超级引用调用Base构造函数,该构造函数依次调用类addValue()中的方法Base,其值变量为10,然后为addValue() Derived类应将20加到值10。 因此最终输出为30。

但是代码显示40。

6 个答案:

答案 0 :(得分:7)

addValue类中的Derived方法被覆盖。重写方法时,即使在基类中发生调用,在此类实例上调用方法也会始终调用重写的版本。

答案 1 :(得分:4)

在类Derived中,方法void addValue()指向在派生而不是Base中定义的方法

答案 2 :(得分:2)

最有可能在扩展Base类时

class Derived extends Base {

  Derived() {

    addValue();

  }

  void addValue() { //here

    value +=  20;

  }

}

您将方法名称放在Base Class中,这将覆盖默认名称:

   void addValue() {
      value += 10;
    }

因此,输出为 40-> 20 + 20

答案 3 :(得分:1)

就像其他人到我面前一样:show(myfunc) addValue中被覆盖,因为它是具有相同名称和相同参数类型的可访问方法。通常,您可以将Derived批注添加到重写方法中。即使基类仍在构建中,派生类中的方法也是如此。

并非所有语言都做同样的事情。例如,当基本构造函数仍在运行时,C ++将不会运行派生类中的重写方法。 C ++中的等效程序的确显示30。

@Override

答案 4 :(得分:0)

addValue()Derived类中被覆盖,并且您创建了Derived类对象。因此,只要addValue()被该实例调用。总是调用Derived类的方法。这就是为什么派生类的addValue()被两次调用的原因。一次在Base类构造函数中,第二次在Derived类构造函数中。

答案 5 :(得分:0)

正如前面讨论的其他方法一样,Method Overriding属性很好地适用于基类中的方法调用。

通过此Java应用运行时多态性,即,根据运行时调用的对象,确定要执行的方法。 例如,

  • 如果使用超类对象调用该方法,则使用超类 方法将被执行。
  • 如果子类对象用于调用 方法,然后将执行子类方法。

如果我们不想覆盖,我们可以将父方法设置为private而不是默认的 private包。现在我们将获得30个输出。 作为无法继承的方法,因此无法覆盖

class Base {

    int value = 0;

    Base() {
        addValue();
    }

    private void addValue() {
        value += 10;
    }

    int getValue() {
        return value;
    }
}

class Derived extends Base {

    Derived() {
        addValue();
    }

    void addValue() {
        value +=  20;
    }
}

public class Test{

    public static void main(String[] args) {
        Base b = new Derived();
        System.out.println(b.getValue());
    }
}

现在,输出为 30