我听说所有Java函数都是隐式虚拟的,但我仍然不确定这是否会按照我想要的方式运行。
假设我有一个A级,有孩子B. A和B都有称为foo()的函数,所以B的定义是重写A的。
假设A有一个被调用的函数,它将A的实例作为参数:
如果我将一个B的实例传入函数,它将调用foo()的定义,A或B是什么?
答案 0 :(得分: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
答案 1 :(得分:3)
B的实施将被调用
这正是virtual
的含义。