【问题标题】:How does JVM resolve overridden and overriding methods in javaJVM如何解析java中被覆盖和覆盖的方法
【发布时间】:2016-09-08 12:16:44
【问题描述】:

根据我对 C++ 多态性的了解(如果我错了,请纠正我)

对于 C++ 中的运行时多态性,编译器维护两件事,首先是每个对象的 vptr 和每个类的 vtable。每当我们调用一个被覆盖的方法时,编译器首先会获取被引用对象的vptr,然后它会去对应类的vtable,然后获取相应方法的地址并执行。

现在我的问题是,

JVM如何执行这个任务??

它还维护一个 vtable 吗?

一个被覆盖和覆盖的方法是如何存储在方法区的??

当我们通过使用引用子类对象的超类引用从子类调用覆盖方法时,幕后实际发生了什么?

【问题讨论】:

  • 我相信这将取决于实现。
  • @OliverCharlesworth,请您通过考虑任何适当的实现来解释一下吗??

标签: java polymorphism


【解决方案1】:

这在invokevirtual的规范中有描述

令 C 为 objectref 的类。要调用的实际方法由以下查找过程选择:

  • 如果 C 包含一个实例方法 m 的声明,它覆盖(第 5.4.5 节)已解析的方法,则 m 是要调用的方法,并且查找过程终止。

  • 否则,如果 C 具有超类,则使用 C 的直接超类递归执行相同的查找过程;要调用的方法是递归调用这个查找过程的结果。

  • 否则,将引发AbstractMethodError

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多