Sud*_*der 2 java inheritance constructor object
class Foo {
int number;
public Foo(int x) {
number = x;
multiply();
}
public void multiply() {
number = 2 * number;
}
public int getNumber() {
return number;
}
}
class Bar extends Foo {
int number;
public Bar(int x,int y) {
super(x);
number = y;
multiply();
}
public void multiply() {
number = number * 3;
}
}
class Test {
public static void main(String args[]) {
Foo foo = new Foo(42);
Foo bar = new Bar(42,24);
System.out.println(foo.getNumber() + "\n" + bar.getNumber());
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码的输出是84和42,但无论我如何跟踪它,我最终得到84和72.任何人都可以详细解释这一点.
这是一个痕迹:
致电new Bar(42,4):
将42被传递给super构造函数.所以它执行以下的主体:
public Foo(int x) {
number = x;
multiply();
}
Run Code Online (Sandbox Code Playgroud)
在number它使用的是它自己number(在Foo.number这是隐藏的),但multiply()它调用的是重载的.因此它呼吁:
public void multiply() {
number = number * 3;
}
Run Code Online (Sandbox Code Playgroud)
但这指的是Bar.number,现阶段0还没有初始化.因此,它仍然是0,number在Foo没有受到影响,因为这不是number出现在这个版本的multiply.
所以目前我们的时间Foo.number是42,而且Bar.number是0.
我们接下来继续
number = y;
multiply();
Run Code Online (Sandbox Code Playgroud)
将24放入Bar.number,然后乘以3.
但是getNumber()没有被覆盖.这意味着,当你打电话给bar.getNumber()你时,你实际上会number从Foo里面得到它.这是42.