以下代码将输出打印为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。
答案 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 。