Java 动态多态性和类文件



我试图了解动态多态性是如何实现的。我有以下代码

public class Bike {
void run() {
System.out.println("bike is running");
}
}
public class Honda extends Bike{
void run() {
System.out.println("honda is running");
}
public static void main(String[] args) {
Bike b = new Honda();
b.run(); // output 'honda is running'
}
}

我试图查看本田类的类文件,下面是主方法的字节码

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: new           #1                  // class newpackage/Honda
3: dup
4: invokespecial #31                 // Method "<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #32                 // Method newpackage/Bike.run:()V
12: return

在第 9 行有 invokevirtual #32,它是常量池中的第 32 个位置,它解析为 Bike.run。自行车类没有#32,其恒定的池只持续到#30 运行时会发生什么,本田类的运行方法最终如何被调用?

编号参数仅适用于该特定类文件,而不适用于跨类文件。正如您所确定的,它解析为Bike.run--此时,JVM 转到Bike类并查找其名为run的方法。

最新更新