本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

用于超级方法的 Java vtable

发布于2021-11-11 16:00     阅读(194)     评论(0)     点赞(20)     收藏(5)


当我们有两个类时:

class Foo {
    void foo() {
        System.out.println("foo");
    }
}

和:

class Bar extends Foo{
    void bar() {
        System.out.println("bar");
    }
}

Bar clazz 对象是在 vtable 中存储对 foo() 和 bar() 方法的引用还是在 Bar 的 vtable 中只引用 bar() 方法并访问 foo() 方法 jvm 访问 Bar clazz 对象,然后 Foo clazz 对象,然后在其 vtable 中找到 foo() 方法?是更像这样: 在此处输入图片说明 还是那样: 在此处输入图片说明 或者这可能在规范中没有描述并且可以依赖于 JVM 实现?


解决方案


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

至于 HotSpot JVM,Java SE 虚拟机的参考实现,它的工作原理就像你的第一张图片,即一个类的单个 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类的所有后代都foo在 vtable 中的相同索引处引用方法。这允许进行足够快的虚拟调用,即即使对于超态方法也能在恒定时间内进行。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/313469/4eeb67dbf136bc67da81/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)