1

我听说所有 Java 函数都是隐式虚拟的,但我仍然不确定这是否会按我想要的方式运行。

假设我有一个类 A,有孩子 B。A 和 B 都有名为 foo() 的函数,所以 B 的定义是覆盖 A 的。

还假设 A 有一个调用的函数,该函数将 A 的实例作为参数:

如果我将 B 的实例传递给函数,它将调用 foo() 的哪个定义,A 还是 B?

4

2 回答 2

4

正如我在评论中提到的私有函数不是虚拟的,我想使用以下示例进行演示:

class A {
    public void foo() {
        System.out.println("A#foo()");
    }

    public void bar() {
        System.out.println("A#bar()");
        qux();
    }

    private void qux() {
        System.out.println("A#qux()");
    }
}

class B extends A {
    public void foo() {
        System.out.println("B#foo()");
    }

    private void qux() {
        System.out.println("B#qux()");
    }
}

现在让我们运行以下代码:

A foobar = new B();
foobar.foo(); // outputs B#foo() because foobar is instance of B
foobar.bar(); // outputs A#bar() and A#qux() because B does not have method bar 
              // and qux is not virtual
于 2013-05-17T21:10:59.013 回答
3

B 的实现将被调用。
正是这个virtual意思。

于 2013-05-17T20:24:06.510 回答