class Base {
int value = 0;
Base() {
add();
}
void add() {
value += 10;
}
int get() {
return value;
}
}
class Derived extends Base {
Derived() {
add();
}
void add() {
value += 20;
}
}
当调用派生类构造函数然后调用add()
时,该值变为40.为什么?
答案 0 :(得分:3)
要自己找出正在发生的事情,您可以在调试器中运行代码并逐步执行以查看一步一步发生的事情。
这就是:
Derived
对象时,value
部分中的字段Base
首先会初始化为0
。Base
的构造函数。这会调用add()
方法。add()
方法,因此调用了类Derived
中的版本,将20
添加到value
;所以value
现在是20
。Derived
的构造函数。这会再次调用add()
方法。add()
中的Derived
,将20
添加到value
。value
包含值40
。Paragraph 12.4解释了如何初始化新对象的规则,以及事情发生的顺序。
答案 1 :(得分:0)
当您调用构造函数时,调用value
方法时add()
字段会增加20。然后再次调用add()
方法,再次添加20,因此value
为20。
答案 2 :(得分:0)
初始化诸如Derived类之类的子类时。它调用其超类的构造函数,在本例中为Base。所以在这种情况下,add()在Base的构造函数和Derived的构造函数中都被调用两次。 因为在Derive中覆盖了add(),所以对Derive对象的add()调用将产生20.即使调用是在Base中,add()方法返回10。