首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于超级方法的Java vtable

用于超级方法的Java vtable
EN

Stack Overflow用户
提问于 2018-12-03 23:02:44
回答 1查看 588关注 0票数 2

当我们有两门课时:

代码语言:javascript
复制
class Foo {
    void foo() {
        System.out.println("foo");
    }
}

以及:

代码语言:javascript
复制
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实现?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-03 23:43:23

JVM规范没有规定如何实现虚拟方法调用。它甚至没有提到vtable的概念。JVM实现可以选择这种或另一种方式,只要它的行为符合预期。

对于Java虚拟机的参考实现,它的工作方式类似于您的第一张图片,即一个类的单个vtable包含它的所有虚拟方法,包括继承的方法。

代码语言:javascript
复制
     ------------------      ------------------ 
    | 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方法。这允许足够快地进行虚拟调用,即在一个恒定的时间内,甚至对于大变形方法也是如此。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53603269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档