gpt4 book ai didi

java - 在这种情况下,JVM 如何处理动态调度?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:51 25 4
gpt4 key购买 nike

给定以下来源和输出:

来源:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com