为什么这个Java代码的输出是这样的?

时间:2016-05-19 09:23:24

标签: java inheritance polymorphism extends

我想知道为什么以下代码:

public class Vertebrate {

   public Vertebrate() {
      System.out.print("Vertebrate ");
   }

   public static void main(String[] args) {
      Mammal rabbit = new Mammal();
      System.out.println("Rabbit");
   }
}

class Mammal extends Vertebrate {
   public Mammal() {
      System.out.print("Mammal ");
   }
}

生成输出:Vertebrate Mammal Rabbit

我被要求详细解释,但我不明白为什么输出就像它一样。请有人帮助我。

4 个答案:

答案 0 :(得分:4)

在调用super()的默认构造函数之前,实例化Vertebrate 隐式调用Vertebrate。这首先打印Mammal。然后继续使用Mammal的构造函数打印Rabbit,最后打http://Dynamicweb8724.nl/webapi/NavToDW/?process="

对于更复杂/更高级的继承/构造函数/覆盖情况,我有一段时间written a Q+A

答案 1 :(得分:0)

对超类的默认构造函数有一个隐式调用:

class Mammal extends Vertebrate {
   public Mammal() {
      super();
      System.out.print("Mammal ");
   }
}

答案 2 :(得分:0)

如您所知,首先执行main方法。 所以这两行是按顺序执行的。

Mammal rabbit = new Mammal();
System.out.println("Rabbit");

所以你可以看到最后打印rabbit的原因。 现在是第一行,

当你写Mammal rabbit = new Mammal();时,你正在创建一个哺乳动物类的实例。 现在new Mammal()调用mammal类的构造函数。对于任何Java类,构造函数的第一行是this.super()无论你是否编写它都无关紧要。 Java为你做到了。

所以在Mammal构造函数里面是超类ie。 Vertebrate首先被实例化。这导致脊椎动物在哺乳动物之前被打印。

答案 3 :(得分:0)

由于子类构造函数隐式调用super()

/ *在显式调用* /

的情况下,调用super()必须是子类构造函数中的第一个语句

了解更多信息: http://docs.oracle.com/javase/tutorial/java/IandI/super.html