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

标签 java jvm polymorphism overriding dispatch

给定以下来源和输出:

来源:

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/

相关文章:

java - Java中调用特定的类方法(不带多态)

haskell - 分析多态性的成本?

java - 似乎无法理解复杂的多态性

java - 以编程方式查找 float 的大小

java - 我应该使用什么类型的列表/ map 来对数据进行分类但保持顺序?

java - JavaScript eval 函数的强大功能

tomcat - PS Permgen 和 Permgen JVM 属性?

java - 通过 SOCKS Proxy 连接到 Kafka

java - 在java中获取控制台文本

Java 接口(interface)合成方法生成,同时缩小返回类型