gpt4 book ai didi

Java接口(interface)

转载 作者:行者123 更新时间:2023-11-29 08:18:27 25 4
gpt4 key购买 nike

JVM 使用的虚拟表解析策略是什么意思?有人可以详细解释一下吗?

最佳答案

基本上任何未声明为 final 的方法都可以在任何继承类中被覆盖。虚拟表解析策略是 Java 如何动态地将方法调用分派(dispatch)给对象的运行时类型的方法定义。例如,如果您有一个对象 s 声明为 Shape 类型但被实例化为 new Circle()(即 Shape s = new Circle()) 然后调用 s.draw()...如果 Circle 覆盖 draw,您需要 Circle 的版本要调用的绘制方法,而不是该方法的 Shape 版本。这些信息只能在运行时弄清楚(如果你传递了一个 Shape 对象,它可能是从编译器永远看不到的 JAR 中传入的,所以编译器无法弄清楚具体的 Shape 子类被实例化了),因此,由 VM 将方法调用分派(dispatch)到正确的方法定义(在本例中,是 Circle 提供的 draw 版本)。

// Shape.javapublic class Shape{     public void draw(){        System.out.println("I'm a Shape");     }}// Circle.javapublic class Circle extends Shape{     public void draw(){           System.out.println("I'm a Circle");     }}// ElsewhereShape s = new Circle();s.draw(); // should print "I'm a Circle"

对于虚拟表的大多数实现,每个类都有一个表,其中每个条目都是一个成员函数及其对应的地址。因此,Circle 和 Shape 的虚拟表在表中都有一个条目用于“draw”,但是 Circle 和 Shape 的虚拟表每个都有 draw point 条目到它们各自的函数定义。然后,该类的每个实例都指向其给定类的虚拟表。因此,当您执行 new Circle() 时,它包含一个指向 Circle 虚拟表的条目。当调用未声明为 final 的方法时,通过在对象的虚拟表中查找适当的偏移量来调用适当的方法实现。

关于Java接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com