有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

测试3。爪哇:

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) 个答案

  1. # 1 楼答案

    因为方法mA中被重写。因此,当它转到超级构造函数并调用m时,该对象仍然是A的实例,因此它调用A中的方法

  2. # 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()实现,这是一个多态调用