Java方法表

Bob*_*r02 5 java jvm virtual-machine vtable

我了解了很多有关C ++如何在存在继承(多重,虚拟等)的情况下管理其虚拟表以及如何将对象放置在内存中的知识。

现在,Java只需要担心继承的单行,而无需隐藏实例方法等。因此,在这种情况下,虚拟表应该更简单一些。我知道Class文件充当方法区域的“网关”,在该区域存储类型定义,包括我假定的方法字节码。我想到以下两个问题:

  1. 通常,Java中是否有任何vtable / method表结构?它是如何存储和链接到Class对象的?
  2. 继承/动态方法调用如何解决?我的意思是:

具有以下类和实例化:

class A{ int f(){...} }
class B extends A{ int f(){...} }

A a = new B();
a.f();
Run Code Online (Sandbox Code Playgroud)

B中的f()被调用。A解析Class文件B是正确的方法指针吗?

预先非常感谢您的评论。

Joo*_*gen 4

对的调用a.f()在java字节码汇编语言中实现为:

aload_1 // load the local variable a, here from local address 1
invokevirtual with index into the constant pool for
    method ref:
        class "A"
        nameAndType "f", "()I"
Run Code Online (Sandbox Code Playgroud)

在运行时,vtable 可能会解决对 Bf() 的调用。但正如您所看到的,类格式非常抽象,并且 JVM 可以完全自由地加载类以实现“高效”实现。