我试图了解如何调用java虚方法。根据我的理解,对象引用变量指向堆中的对象,从该对象访问对象特定的变量值,并且方法定义由堆栈帧的常量池引用指向。调用方法填充引用变量(因为它是一个局部变量)。如何以及何时填充调用方法的常量池引用值? 如果我的理解不正确,请原谅。 添加链接以便清晰 https://imgur.com/a/rv8fW9X
答案 0 :(得分:0)
如何以及何时填充调用方法的常量池参考值?
相关的常量池是出现invokevirtual
指令的类之一。池及其所有内容都是类文件的一部分。它们是由Java编译器创建的,当整个类是从其Java源代码创建的时候。
引用常量池元素的字节码指令,例如invokevirtual
,由元素的索引完成,该索引由编译器(再次由编译器)编码到字节代码中。接下来,虽然invokevirtual
方法的目标对象可能因同一指令的不同执行而有所不同,但常量池引用永远不会。这直接对应于对象引用保存在Java语言中的变量这一事实,但方法调用表达式要求显式命名该方法。
但是,由于执行虚拟方法调用,方法引用是针对目标对象解析的,因此调用的实际方法可能会有所不同。