Suppose we have:
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 }
Question:
From the assembly, a BlueFish object was created. But why the
javac
didn't realize thatBlueFish.speak()
should be invoked?During runtime, how does the JVM handle
invokespecial #4
, so that the right target wil be called?
FYI, the javap -c
output is:
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
}