【发布时间】:2013-05-22 22:35:30
【问题描述】:
给定以下来源和输出:
来源:
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() 中被调用。既然super 关键字显式指定了A 类,那么在专门调用super.foo() 时调用的bar() 不调用类A 的bar() 方法怎么办? JVM 需要经过哪些步骤才能解决这个问题?
另外,这是否意味着从他们自己的类中调用公共方法通常是个坏主意,因为它们可以以这种方式被覆盖?
【问题讨论】:
-
如果您有解决方案,请分享。我也在寻找这个问题的解决方案。 “到底发生了什么”
标签: java jvm polymorphism overriding dispatch