類(lèi)的實(shí)例化順序是先實(shí)例化父類(lèi)在實(shí)例化子類(lèi),也就是先調(diào)用父類(lèi)的構(gòu)造方法,再調(diào)用子類(lèi)的構(gòu)造方法,如果在構(gòu)造方法中調(diào)用其他多態(tài)方法,可能導(dǎo)致不正確的結(jié)果。
下面的例子,在父類(lèi)中調(diào)用study()方法的時(shí)候,會(huì)有點(diǎn)問(wèn)題
class Person {
public void study() {
System.out.println("I am studing!");
}
public Person() {
study();
}
}
class Student extends Person {
private int age;
public Student() {
this.age = 15;
study();
}
public void study() {
System.out.println("I am " + age + " years old, I am studing!");
}
}
public class Constructor {
public static void main(String[] args) {
Person person = new Student();
person.study();
}
}
執(zhí)行結(jié)果;
I am 0 years old, I am studing!
I am 15 years old, I am studing!
I am 15 years old, I am studing!
在父類(lèi)的構(gòu)造方法中調(diào)用study方法時(shí), 其實(shí)Student中的age還沒(méi)有初始化,因此是默認(rèn)值0。