给定以下来源和输出:
来源:
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();
}
}
输出:
在 B 的 bar() 方法中
有人可以向我解释一下 JVM 是如何智能到在这种情况下以多态方式调用 B 的(而不是 A 的)bar() 方法的吗?我想知道这里的幕后发生了什么样的动态调度魔法。
更新:如果我不够清楚,我基本上知道发生了什么,我正在寻找有关 JVM 如何在幕后发生的具体细节。到目前为止的答案过于简单。
更新 2:可能我不够清楚。当b.foo()
被调用时,super.foo()
被调用,然后bar()
在类A的中被调用>foo()
。具体调用super.foo()
时调用的bar()
怎么不调用类A的bar()
方法呢,因为super
关键字明确指定类A? JVM 必须经过哪些步骤才能解决这个问题?
此外,这是否意味着从它们自己的类中调用公共(public)方法通常不是一个好主意,因为它们可以通过这种方式被覆盖?
最佳答案
Java 在调用方法时使用对象的类型。
A b = new B();
b.foo();
假设您使用了上面的代码。 这里将发生的是您正在创建类型 B 的对象并将其分配给类型 A 的引用。由于对象类型是 B,您将调用类 B 中的方法。
关于java - 在这种情况下,JVM 如何处理动态调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16783867/