class Animal {
String brain = "动物大脑";
String heart = "动物心脏";
public static int animalCount = 7700000;
public Animal(String brain, String heart) {
System.out.println("Animal 类中:");
System.out.println("Animal 构造函数正在运行!");
System.out.println("Animal 的类变量是否初始化?");
System.out.println("animalCount = " + animalCount);
System.out.println("现在的 brain = " + this.brain);
System.out.println("现在的 heart = " + this.heart);
System.out.println("Cat类中的类变量是否初始化?");
System.out.println("catCount = " + Cat.catCount);
this.brain = brain;
this.heart = heart;
System.out.println("brain = " + this.brain);
System.out.println("heart = " + this.heart);
}
}
public class Cat extends Animal {
String tail = "猫初始值的尾巴";
static int catCount = 37;
public Cat(String brain, String heart, String tail) {
super(brain, heart);
System.out.println("Cat 类中:");
System.out.println("Cat 构造函数已经启动,super调" +
"用Animal构造函数初始化变量");
System.out.println("现在的 catCount = " + catCount);
System.out.println("tail = " + this.tail);
this.tail = tail;
System.out.println("赋值后的 tail = " + this.tail);
}
public static void main(String[] args) {
Cat cat = new Cat("猫对象大脑", "猫对象心脏", "猫对象尾巴");
}
}
输出:
Animal 类中:
Animal 构造函数正在运行!
Animal 的类变量是否初始化?
animalCount = 7700000
现在的 brain = 动物大脑
现在的 heart = 动物心脏
Cat类中的类变量是否初始化?
catCount = 37
brain = 猫对象大脑
heart = 猫对象心脏
Cat 类中:
Cat 构造函数已经启动,super调用Animal构造函数初始化变量
现在的 catCount = 37
tail = 猫初始值的尾巴
赋值后的 tail = 猫对象尾巴
所以顺序为:
- 父类(Animal)静态变量初始化,本例中 animalCount = 770000;
- 子类(Cat)静态变量初始化; 本例中catCount = 37;
- 然后初始父类的非静态变量。我们专门为它们分配了初始值,然后在构造函数中替换它们。Animal 的构造函数还没有完成,但是 Brain 和 heart 的初始值已经赋值了(现在的 brain = 动物大脑,现在的 heart = 动物心脏);
- 父类构造函数启动;
- 子类( Cat) 的非静态字段被初始化,这发生在Cat构造函数开始运行之前,当它开始运行时,tail 变量已经有了一个值(tail = 猫父类尾巴);
- Cat子类的构造函数被调用



