我们可以通过初始化具体的子类来初始化抽象类.因此,应该只能在子类初始化之后才能调用抽象类的抽象方法,然而,抽象类Mammal中的以下初始化块可以在子子类初始化之前调用抽象方法.
如果使用new Platypus()调用Platypus的构造函数,它将输出: "好吃!", "哺乳动物建造者", "鸭嘴兽构造者"的顺序相同.我认为类的实例是在调用构造函数时创建的.但Mammal中的初始化块能够在Platypus初始化之前调用该方法.
abstract class Mammal {
{
System.out.println(chew());
}
abstract CharSequence chew();
public Mammal() {
System.out.println("Mammal constructor");
}
}
public class Platypus extends Mammal {
public Platypus() {
System.out.println("Platypus constructor");
}
String chew() {
return "yummy!";
}
}