2017-10-20 58 views
-4

这是关闭评论测验,以帮助我了解材料,但答案让我感到困惑。java。继承/多态,测验错误?

//问题10

什么将这个程序打印出来?

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()); 

} 

} 

它是在java中。答案是40?我无法理解为什么。

+0

你不了解什么? 20 + 20 = 40 – shmosel

+0

是否有'main'?这是如何运行? –

+0

[没有尝试](http://idownvotedbecau.se/noattempt)。至少你应该发布你相信的和你的答案,以便我们可以指出你的答案有什么问题。 – Alex

回答

0

这里发生了什么,当您拨打Base b = new Derived()它首先在派生类上调用Derived()。现在,作为Derived班轮流扩展Base类内部Derived类 调用基类的默认cunstructor,similer的每一个构造函数

Derived() { 
     super(); 
     addValue(); 
    } 

它调用Base()。现在里面有Base()addValue()在那里。由于instanse是Derived类的addValue()方法是从Derived类称为(阅读重写动态法分派器) 所以value变得value+20= i.e. 20。然后,当从返回时,它在Derived()内再次获得addValue()。所以它再次呼叫addValue()和值value变成(20+20)

N.B .:你真的需要阅读很多关于多态性,Dynamic method dispatcher for this。

+0

谢谢。我不知道子类在扩展它时调用基类的默认构造函数。我们正在使用的教科书没有进入多态。尽管如此,我将查找动态方法调度程序的网络。 –