假设我们有:
1 public class DynamicDispatch {
2 public static void main(String[] args) {
3 Fish f = new BlueFish();
4 f.speak();
5 }
6 }
7
8 abstract class Fish {
9 abstract String speak();
10 }
11
12 class BlueFish extends Fish {
13 String speak() {
14 return "I am a blue fish";
15 }
16 }
17
18 class CatFish extends Fish {
19 String speak() {
20 return "I am a cat fish";
21 }
22 }
问题:
从程序集中创建了一个BlueFish对象。但为什么javac
没有意识到应该调用BlueFish.speak()
?
在运行时,JVM如何处理invokespecial #4
,以便调用正确的目标?
仅供参考,javap -c
输出为:
Compiled from "DynamicDispatch.java"
public class DynamicDispatch extends java.lang.Object{
public DynamicDispatch();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class BlueFish
3: dup
4: invokespecial #3; //Method BlueFish."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4; //Method Fish.speak:()Ljava/lang/String;
12: pop
13: return
}
答案 0 :(得分:0)
<强>答案:强>
javac没有尝试实现它,因为很容易让javac很难找到,甚至根本不会发现。例如,您可能会发现是否使用用户输入来使用CatFish
或BlueFish
。
为此,请参阅BevynQ的评论。我很惊讶他没有把它作为答案添加。