发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!