当“Fish f = new BlueFish();”时会发生什么?

时间:2013-07-12 00:37:48

标签: java jvm javac dynamic-binding dynamic-dispatch

假设我们有:

  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 }

问题

  1. 从程序集中创建了一个BlueFish对象。但为什么javac没有意识到应该调用BlueFish.speak()

  2. 在运行时,JVM如何处理invokespecial #4,以便调用正确的目标?

  3. 仅供参考,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
    
    }
    

1 个答案:

答案 0 :(得分:0)

<强>答案:

  1. javac没有尝试实现它,因为很容易让javac很难找到,甚至根本不会发现。例如,您可能会发现是否使用用户输入来使用CatFishBlueFish

  2. 为此,请参阅BevynQ的评论。我很惊讶他没有把它作为答案添加。