当我们有两门课时:
class Foo {
void foo() {
System.out.println("foo");
}
}以及:
class Bar extends Foo{
void bar() {
System.out.println("bar");
}
}Bar clazz对象是在vtable中存储对foo()和bar()方法的引用,还是在vtable中只引用bar()方法和访问foo()方法jvm访问Bar clazz对象,然后Foo clazz对象然后在vtable中找到foo()方法?是不是更像这样:

或者说:

或者,这可能没有在规范中描述,并且可以依赖于JVM实现?
发布于 2018-12-03 23:43:23
JVM规范没有规定如何实现虚拟方法调用。它甚至没有提到vtable的概念。JVM实现可以选择这种或另一种方式,只要它的行为符合预期。
对于Java虚拟机的参考实现,它的工作方式类似于您的第一张图片,即一个类的单个vtable包含它的所有虚拟方法,包括继承的方法。
------------------ ------------------
| Foo.class vtable | | Bar.class vtable |
|------------------| |------------------|
| clone | | clone | \
| equals | | equals | | java.lang.Object
| hashCode | | hashCode | / virtual methods
| ... | | ... |
| foo | | foo | } Foo virtual methods
------------------ | bar | } Bar virtual methods
------------------这种布局保证了Foo类的所有后代都将在vtable中的同一索引中引用foo方法。这允许足够快地进行虚拟调用,即在一个恒定的时间内,甚至对于大变形方法也是如此。
https://stackoverflow.com/questions/53603269
复制相似问题