我正在 java 中测试一些多态性,我的代码如下所示:
class Base {
int value = 0;
public Base(){
System.out.println("Came Here And Value is: " + value);
addValue();
}
String addValue(){
System.out.println("Calling Bases' addValue and value is currently: " + value);
value += 10;
return "";
}
int getValue(){
return value;
}
}
class Derived extends Base{
public Derived(){
System.out.println("Calling Derived constructor and value currently is: " + value);
addValue();
}
String addValue(){
System.out.println("Came to Deriveds' addValue and value now is: " + value);
value += 20;
return "";
}
int getValue(){
return value;
}
}
public class MyClass {
public static void main(String [] args){
Base b = new Derived();
System.out.println(b.getValue());
}
}
这里的事情是,它打印 40,但我猜它应该打印 30。我的想法是:new Derived 首先调用 new Base,它调用 addValue()
并且(如Base中定义的addValue()
将值加10)此时值应为10。然后,Derived 的 addValue()
被称为使值 30(因为派生中定义的 addValue()
将值增加 20)。但是相反,Base 调用它的 child 的 addValue()
.有人可以解释发生了什么吗?
最佳答案
你思维过程中的错误观念被加粗了:
new Derived first calls new Base, which calls addValue() and (as addValue() defined in Base adds up value by 10) value should be 10 at that time. then, Derived's addValue() is called which makes value 30 (because addValue() defined in Derived adds value up by 20).
尽管 addValue
被放置在基类构造函数中,它仍然在 this
上调用 addValue
,如下所示:
this.addValue();
嗯,什么是this
?它是一个 Derived
类实例。派生类的 addValue
有什么作用?它加了 20。这就是你得到 40 的原因。
关于java - 父构造函数调用的方法表现为子方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45264611/