我听说所有 Java 函数都是隐式虚拟的,但我仍然不确定这是否会按我想要的方式运行。
假设我有一个类 A,有孩子 B。A 和 B 都有名为 foo() 的函数,所以 B 的定义是覆盖 A 的。
还假设 A 有一个调用的函数,该函数将 A 的实例作为参数:
如果我将 B 的实例传递给函数,它将调用 foo() 的哪个定义,A 还是 B?
正如我在评论中提到的私有函数不是虚拟的,我想使用以下示例进行演示:
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
B 的实现将被调用。
正是这个virtual
意思。