类Java中的继承

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.任何人都可以详细解释这一点.

Rea*_*tic 5

这是一个痕迹:

致电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,numberFoo没有受到影响,因为这不是number出现在这个版本的multiply.

所以目前我们的时间Foo.number是42,而且Bar.number是0.

我们接下来继续

    number = y;
    multiply();
Run Code Online (Sandbox Code Playgroud)

将24放入Bar.number,然后乘以3.

但是getNumber()没有被覆盖.这意味着,当你打电话给bar.getNumber()你时,你实际上会numberFoo里面得到它.这是42.