對于Java對象的構造和初始化過程的理解,我們可以先掌握如下規則:
1)在進入main方法之前類加載時,執行static修飾的靜態代碼塊,并且只執行一次。先執行父類靜態代碼塊再執行子類靜態代碼塊。
2)執行父類初始化塊(游離塊),構造方法。
本文引用地址://m.gxqdgs.com/emb/Column/7449.html
初始化塊,每創建一個對象調用一次。
如果構造方法中使用this()調用其他構造方法,該行代碼必須放在構造方法中第一行。
3)執行子類初始化塊(游離塊),構造方法。
初始化塊,每創建一個對象調用一次。
在子類構造方法中,如果沒有通過super顯式調用父類構造方法,則默認調用父類無參構造方法;如果通過super顯示調用父類構造方法,該代碼必須放在第一行。
舉例說明如下:
創建父類Person.java
public class Person {
private String name;
private int age;
private String sex;
static{
System.out.println("這是靜態代碼塊Person");
}
{
System.out.println("這是自由代碼塊Person");
}
//第一個構造方法
public Person(){
System.out.println("Person()");
}
//第二個構造方法
public Person(String name,int age){
System.out.println("Person(String name,int age)");
this.age = age;
this.name = name;
}
//第三個構造方法
public Person(String name,int age,String sex){
this(name,age);
System.out.println("Person(String name,int age,String sex)");
this.sex = sex;
}
}
創建子類Student.java
public class Student extends Person {
static{
System.out.println("這是靜態代碼塊Student");
}
{
System.out.println("這是自由代碼塊Student");
}
//第一個構造方法
public Student(String name,String sex,int age){
super(name,age,sex);
System.out.println("Student(String name,String sex,int age)");
}
//第二個構造方法
public Student(){
System.out.println("Student()");
}
}
創建測試類Test.java
public class Test {
public static void main(String[] args) {
Student s = new Student("violet","female",33);
Student s1 = new Student();
}
}
運行輸出結果如下:
這是靜態代碼塊Person //第一行
這是靜態代碼塊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)在類加載時,也就是執行main方法之前執行靜態代碼塊,只執行一次,所以輸出//第一行、//第二行。
2)當我們執行main函數中Student s = new Student("violet","female",33);語句時,先調用父類初始化塊,輸出//第三行。
再調用父類構造方法,在Studet.java第一個構造方法中通過super(name,sex,age)調用父類Person.java中第三個構造方法,該構造方法中第一行代碼this(name,age)指向第二個構造方法,所以先執行第二個構造方法,輸出//第四行。第二個構造方法執行結束,返回到第三個構造方法,輸出//第五行
父類構造方法執行完畢,返回到Student.java類。先執行初始化塊,輸出//第六行。再執行第一個構造方法里,輸出//第七行。
3)當我們執行main函數中Student s1 = new Student();語句時,先調用父類初始化塊,輸出//第八行。
再執行父類構造方法,在Student.java第二個構造方法里,沒有通過super()顯示調用父類某個構造方法,此時默認調用父類無參構造方法。所以輸出//第九行。
父類構造方法執行完畢,返回到Student.java類。先執行初始化塊,輸出//第十行。再執行第二個構造方法,輸出//第十一行。