为什么超类B调用子类A的方法?

时间:2014-08-31 01:52:39

标签: java c++ inheritance polymorphism

Test3.java:

public class Test3 {
    public static void main(String[] args) {
        A a = new A();
    }
}

class A extends B {

    A() {
        System.out.println("Now in A()");
    }

    void m() {
        System.out.println("Now in m() of A");
    }
}

class B {
    B() {
        System.out.println("Now in B()");
        m();
    }

    void m() {
        System.out.println("Now in m() of B");
    }
}

输出:

    $ java Test3
Now in B()
Now in m() of A
Now in A()

为什么不"现在在B"的m()中在第二行输出?

2 个答案:

答案 0 :(得分:3)

因为m中的方法A被覆盖了。因此,当它转到超级构造函数和类m时,该对象仍然是A的实例,因此它调用A中的方法。

答案 1 :(得分:2)

因为Java中的方法默认为virtual,所以如果使用Java 6或更高版本,建议您使用@Override注释,这会使事情变得更清晰。

第一个问题是:为什么第一行是

Now in B()

原因是:当你可以用Java扩展一个类时,编译器会自动为你调用super constructor

A() {
    super(); // added by Java !!
    System.out.println("Now in A()");
}

所以,现在我们在B's constructor

B() {
    System.out.println("Now in B()"); // print this
    m(); // Ohh hang on, m() is overridden
}

因为m()被子类A覆盖,而实际的实例是A类,所以我们将调用A的m()实现,这是一个多态调用。