java中虚函数和虚继承底层实现有没有虚表

java中虚函数和虚继承底层实现有没有虚表,第1张

Java 所有非 final 方法(final class 中的所有方法被视为 final 方法) 的话,它就是 virtual 的,可以被子类覆盖。在创建对象时类型是 new 语句后面的类型,你调用的方法就优先根据 new 后面的语句类型来找,没找到就向父类层次中找的。

JVM 中有每个类和其中的每个方法的清单,调用时会去按多态的概念去查找方法。

运行:Objective-C runtime 运行 native code 。Java VM 运行 byte code。

垃圾回收:Objective-C runtime 有过短暂的使用 conservative GC。但是 conservative GC 对于 native code,特别是经过优化的 native code 并不有效。所以目前 Objective-C 没有 GC(只有 ref-counting 的内存管理策略)。Java VM 有 generational GC。

动态机制:Objective-C runtime 对 class method 的调用是通过全局名称查询。而 Java VM 是通过类似 C++ 的虚表机制。所以 Objective-C 无须 explicit interface 就能实现多态,能动态的给 class 添加方法,Java 则不行。这是很讽刺的,一个基于 byte code 的语言居然不如一个 native code 的语言动态。(Java 有 reflection 机制,但是这套机制是独立于 JVM 本身的静态调用机制的。Reflection 给予了你操作虚表的能力,但是基本的 JVM 仍然是通过虚表这个静态机制完成的。)

对象:Objective-C 考虑到和 C 的交互,对象不能 relocatable。Java 的对象可以 relocate,因为没有 raw pointer 。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/56432.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-26
下一篇2023-02-26

发表评论

登录后才能评论

评论列表(0条)

    保存