给定以下源和输出:
资源:
public class A
{
public void foo()
{
bar();
}
public void bar()
{
System.out.println ("in A's bar() method");
}
}
public class B extends A
{
@Override
public void foo()
{
super.foo();
// Do some specialized B stuff
}
@Override
public void bar()
{
System.out.println ("in B's bar() method");
}
}
public class Main
{
public static void main (String... args)
{
B b = new B();
b.foo();
}
}
输出:
in B's bar() method
有人可以向我解释一下 JVM 如何足够聪明地在这种情况下多态地调用 B(而不是 A)的 bar() 方法吗?我想知道这里幕后发生了什么样的动态调度魔法。
更新:如果我不够清楚,我基本上知道发生了什么,我正在寻找有关 JVM 如何使其在幕后发生的具体细节。到目前为止的答案太简单了。
更新2:也许我不够清楚。当b.foo()
被调用时,然后super.foo()
被调用,然后bar()
在类 A 中被调用foo()
。既然关键字明确指定了类A ,bar()
那么在专门调用super.foo()
不调用类A的bar()
方法时如何调用?super
JVM 必须经过哪些步骤才能解决这个问题?
另外,这是否意味着从他们自己的类中调用公共方法通常是一个坏主意,因为它们可以以这种方式被覆盖?