在继承中虚拟函数如何在后台工作?编译器是否特别对待虚拟函数?
是的,编译器和运行时对虚拟方法的处理方式有所不同。JVM专门利用虚拟方法表进行虚拟方法分配:
对象的调度表将包含对象的动态绑定方法的地址。通过从对象的分派表中获取方法的地址来执行方法调用。属于同一类的所有对象的分发表都是相同的,因此通常在它们之间共享。属于类型兼容类的对象(例如,继承层次结构中的同级对象)将具有具有相同布局的调度表:对于所有类型兼容类,给定方法的地址将以相同的偏移量出现。因此,从给定的分配表偏移量中获取方法的地址将获得与对象的实际类相对应的方法。
一、运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二、垃圾收集 判断一个对象是否可被回收 引用类型 垃圾收集算法 垃圾收集器 三、内存分配与回收策略 Minor GC 和 Full GC 内存分配策略 Full GC 的触发条件 四、类加载机制 类的生命周期 类加载过程 类初始化时机 类与类加载器 类加载器分类 双亲委派模型 自定义类加载器实现 参
一、前言 本部分内容是关于Java虚拟机的一些面试高频知识点的总结。说到对Java虚拟机的学习,就不得不提下这本书《深入理解Java虚拟机》。 本部分的内容也是基于这本书进行整理的,这本书基本是面试必备。 关于Java虚拟机,重点考察以下三个方面的内容: 内存区域/内存模型 类加载机制 垃圾收集算法/收集器 二、目录 对象的创建、内存布局和访问定位 Java内存区域与内存模型 Java类加载机制及
问题内容: 我了解什么是Java方法调用,并使用它练习了很多示例。 我想知道这个概念的实际情况或需要。如果有人能给出使用它的真实场景,这将有很大帮助,如果没有这个概念,将会发生什么? 问题答案: 这是一个例子。假设我们有2个类别: 如果我们现在执行以下操作: 我们得到结果 如果Java没有,它将在编译时确定要调用的是属于该类的。既然不是,而是在运行时根据所指向的实际类来确定,则可以得到以上结果。
让我们在Visual C 2010中假设以下场景: 理论上,这个小应用程序的输出应该是: 基本:非虚拟显示。 基础:虚拟显示。 基本:非虚拟显示。 派生:虚拟显示。 因为基类的显示方法不是虚拟方法,所以派生类不能重写它。正当 问题是,当我运行应用程序时,它会打印以下内容: < li >基本:非虚拟显示。 < li >基本:虚拟显示。 < li >派生:非虚拟显示。 < li >派生:虚拟显示。 所
问题内容: 我正在查看Java 8接口中的新虚拟扩展方法: 我的目的是允许接口随着时间的推移以及多重继承的发展而演变,但是在我看来,它们看上去非常像抽象类。 如果您要进行新工作,则是使用抽象类而不是扩展方法来为“接口”提供实现,或者这两种方法在概念上是否等效? 问题答案: 这种构造的主要目的是保持向后兼容性。在Java语言中添加闭包是一个重大的更改,需要对其进行更新以充分利用此功能。例如,在Jav
问题内容: 我已经在某些计算机科学测试中看到了下一段,希望我能在这里对它的含义有一个很好的解释,因为我用它搜索了一个小时,却找不到任何东西。 “当我们说Java语言具有 虚拟方法调用时 ,是指在Java应用程序中,执行的方法由运行时的对象类型决定” 这是什么意思?谁能更好地解释它? 问题答案: 这些行的作者使用的C ++术语。 更好的术语是动态绑定/动态调度。 这意味着,对象的动态类型是“选择”将