當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Java對象構(gòu)造和初始化過程
對于Java對象的構(gòu)造和初始化過程的理解,我們可以先掌握如下規(guī)則:
1)在進(jìn)入main方法之前類加載時(shí),執(zhí)行static修飾的靜態(tài)代碼塊,并且只執(zhí)行一次。先執(zhí)行父類靜態(tài)代碼塊再執(zhí)行子類靜態(tài)代碼塊。
2)執(zhí)行父類初始化塊(游離塊),構(gòu)造方法。
本文引用地址://www.einuk.cn/emb/Column/7449.html
初始化塊,每創(chuàng)建一個(gè)對象調(diào)用一次。
如果構(gòu)造方法中使用this()調(diào)用其他構(gòu)造方法,該行代碼必須放在構(gòu)造方法中第一行。
3)執(zhí)行子類初始化塊(游離塊),構(gòu)造方法。
初始化塊,每創(chuàng)建一個(gè)對象調(diào)用一次。
在子類構(gòu)造方法中,如果沒有通過super顯式調(diào)用父類構(gòu)造方法,則默認(rèn)調(diào)用父類無參構(gòu)造方法;如果通過super顯示調(diào)用父類構(gòu)造方法,該代碼必須放在第一行。
舉例說明如下:
創(chuàng)建父類Person.java
public class Person {
private String name;
private int age;
private String sex;
static{
System.out.println("這是靜態(tài)代碼塊Person");
}
{
System.out.println("這是自由代碼塊Person");
}
//第一個(gè)構(gòu)造方法
public Person(){
System.out.println("Person()");
}
//第二個(gè)構(gòu)造方法
public Person(String name,int age){
System.out.println("Person(String name,int age)");
this.age = age;
this.name = name;
}
//第三個(gè)構(gòu)造方法
public Person(String name,int age,String sex){
this(name,age);
System.out.println("Person(String name,int age,String sex)");
this.sex = sex;
}
}
創(chuàng)建子類Student.java
public class Student extends Person {
static{
System.out.println("這是靜態(tài)代碼塊Student");
}
{
System.out.println("這是自由代碼塊Student");
}
//第一個(gè)構(gòu)造方法
public Student(String name,String sex,int age){
super(name,age,sex);
System.out.println("Student(String name,String sex,int age)");
}
//第二個(gè)構(gòu)造方法
public Student(){
System.out.println("Student()");
}
}
創(chuàng)建測試類Test.java
public class Test {
public static void main(String[] args) {
Student s = new Student("violet","female",33);
Student s1 = new Student();
}
}
運(yùn)行輸出結(jié)果如下:
這是靜態(tài)代碼塊Person //第一行
這是靜態(tài)代碼塊Student //第二行
這是自由代碼塊Person //第三行
Person(String name,int age) //第四行
Person(String name,int age,String sex) //第五行
這是自由代碼塊Student //第六行
Student(String name,String sex,int age) //第七行
這是自由代碼塊Person //第八行
Person() //第九行
這是自由代碼塊Student //第十行
Student() //第十一行
解釋說明如下:
1)在類加載時(shí),也就是執(zhí)行main方法之前執(zhí)行靜態(tài)代碼塊,只執(zhí)行一次,所以輸出//第一行、//第二行。
2)當(dāng)我們執(zhí)行main函數(shù)中Student s = new Student("violet","female",33);語句時(shí),先調(diào)用父類初始化塊,輸出//第三行。
再調(diào)用父類構(gòu)造方法,在Studet.java第一個(gè)構(gòu)造方法中通過super(name,sex,age)調(diào)用父類Person.java中第三個(gè)構(gòu)造方法,該構(gòu)造方法中第一行代碼this(name,age)指向第二個(gè)構(gòu)造方法,所以先執(zhí)行第二個(gè)構(gòu)造方法,輸出//第四行。第二個(gè)構(gòu)造方法執(zhí)行結(jié)束,返回到第三個(gè)構(gòu)造方法,輸出//第五行
父類構(gòu)造方法執(zhí)行完畢,返回到Student.java類。先執(zhí)行初始化塊,輸出//第六行。再執(zhí)行第一個(gè)構(gòu)造方法里,輸出//第七行。
3)當(dāng)我們執(zhí)行main函數(shù)中Student s1 = new Student();語句時(shí),先調(diào)用父類初始化塊,輸出//第八行。
再執(zhí)行父類構(gòu)造方法,在Student.java第二個(gè)構(gòu)造方法里,沒有通過super()顯示調(diào)用父類某個(gè)構(gòu)造方法,此時(shí)默認(rèn)調(diào)用父類無參構(gòu)造方法。所以輸出//第九行。
父類構(gòu)造方法執(zhí)行完畢,返回到Student.java類。先執(zhí)行初始化塊,輸出//第十行。再執(zhí)行第二個(gè)構(gòu)造方法,輸出//第十一行。