Java對象(xiang)構造和初(chu)始化過程
時間:2018-09-27 來源:未知
對(dui)于(yu)Java對(dui)象的(de)構造和初(chu)始(shi)化過程的(de)理(li)解,我們(men)可(ke)以先(xian)掌握如(ru)下規則(ze):
1)在進入main方法之前類(lei)加載時,執(zhi)(zhi)(zhi)行(xing)(xing)static修飾的靜(jing)態代(dai)碼(ma)塊(kuai),并且只(zhi)執(zhi)(zhi)(zhi)行(xing)(xing)一次。先執(zhi)(zhi)(zhi)行(xing)(xing)父類(lei)靜(jing)態代(dai)碼(ma)塊(kuai)再(zai)執(zhi)(zhi)(zhi)行(xing)(xing)子類(lei)靜(jing)態代(dai)碼(ma)塊(kuai)。
2)執行(xing)父類初始化塊(游離(li)塊),構造(zao)方法。
本文引用地址://fsbing.cn/emb/Column/7449.html
初始化塊(kuai),每創(chuang)建一(yi)個對象調用一(yi)次。
如(ru)果構造方法中使(shi)用this()調用其他構造方法,該行(xing)代碼必須放(fang)在構造方法中第一行(xing)。
3)執(zhi)行(xing)子類初(chu)始化塊(游離塊),構造方法。
初始化塊,每創建一個對象調用一次(ci)。
在子類(lei)構造(zao)方(fang)法中(zhong),如果沒有(you)通過(guo)super顯式調用父(fu)類(lei)構造(zao)方(fang)法,則默(mo)認(ren)調用父(fu)類(lei)無參構造(zao)方(fang)法;如果通過(guo)super顯示調用父(fu)類(lei)構造(zao)方(fang)法,該(gai)代(dai)碼必須(xu)放在第一行。
舉(ju)例說明如下:
創建父類Person.java
public class Person {
private String name;
private int age;
private String sex;
static{
System.out.println("這是靜(jing)態代碼塊(kuai)Person");
}
{
System.out.println("這(zhe)是自由代碼塊Person");
}
//第一個構造方法
public Person(){
System.out.println("Person()");
}
//第二(er)個構造方法
public Person(String name,int age){
System.out.println("Person(String name,int age)");
this.age = age;
this.name = name;
}
//第三個構造(zao)方(fang)法(fa)
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("這是自(zi)由(you)代碼塊Student");
}
//第(di)一個構造方法
public Student(String name,String sex,int age){
super(name,age,sex);
System.out.println("Student(String name,String sex,int age)");
}
//第(di)二個(ge)構造方法
public Student(){
System.out.println("Student()");
}
}
創(chuang)建測試(shi)類Test.java
public class Test {
public static void main(String[] args) {
Student s = new Student("violet","female",33);
Student s1 = new Student();
}
}
運行輸出結果如下:
這是靜態代碼(ma)塊Person //第一行
這是靜(jing)態代碼塊(kuai)Student //第二行(xing)
這是自由代碼塊Person //第(di)三行
Person(String name,int age) //第四行
Person(String name,int age,String sex) //第(di)五行
這(zhe)是(shi)自由代碼塊Student //第六行
Student(String name,String sex,int age) //第七行
這是自(zi)由代碼塊Person //第(di)八行
Person() //第九(jiu)行
這(zhe)是(shi)自由代碼塊Student //第(di)十行
Student() //第十一行
解釋(shi)說明如下(xia):
1)在類加載時,也(ye)就是執(zhi)行(xing)(xing)main方法之前(qian)執(zhi)行(xing)(xing)靜態代碼塊(kuai),只執(zhi)行(xing)(xing)一次,所以(yi)輸(shu)出//第一行(xing)(xing)、//第二行(xing)(xing)。
2)當我們(men)執行main函數中(zhong)Student s = new Student("violet","female",33);語句(ju)時,先(xian)調(diao)用父類初(chu)始化塊(kuai),輸出//第三行。
再調用父類構(gou)(gou)造(zao)方法(fa),在Studet.java第(di)(di)(di)(di)(di)一個構(gou)(gou)造(zao)方法(fa)中通過super(name,sex,age)調用父類Person.java中第(di)(di)(di)(di)(di)三個構(gou)(gou)造(zao)方法(fa),該(gai)構(gou)(gou)造(zao)方法(fa)中第(di)(di)(di)(di)(di)一行(xing)代碼this(name,age)指(zhi)向第(di)(di)(di)(di)(di)二個構(gou)(gou)造(zao)方法(fa),所(suo)以先執行(xing)第(di)(di)(di)(di)(di)二個構(gou)(gou)造(zao)方法(fa),輸出(chu)//第(di)(di)(di)(di)(di)四行(xing)。第(di)(di)(di)(di)(di)二個構(gou)(gou)造(zao)方法(fa)執行(xing)結束,返回到第(di)(di)(di)(di)(di)三個構(gou)(gou)造(zao)方法(fa),輸出(chu)//第(di)(di)(di)(di)(di)五行(xing)
父類構造方法執(zhi)(zhi)行(xing)完畢,返回(hui)到Student.java類。先執(zhi)(zhi)行(xing)初(chu)始化塊,輸(shu)出//第六(liu)行(xing)。再執(zhi)(zhi)行(xing)第一個構造方法里,輸(shu)出//第七(qi)行(xing)。
3)當我們執(zhi)行main函數中Student s1 = new Student();語句時(shi),先調用父類初始化(hua)塊,輸(shu)出(chu)//第八行。
再執行父(fu)類(lei)構造方(fang)(fang)(fang)法(fa),在Student.java第二個構造方(fang)(fang)(fang)法(fa)里(li),沒(mei)有通(tong)過super()顯示調用父(fu)類(lei)某個構造方(fang)(fang)(fang)法(fa),此(ci)時默(mo)認調用父(fu)類(lei)無參(can)構造方(fang)(fang)(fang)法(fa)。所以輸出//第九(jiu)行。
父(fu)類(lei)構(gou)(gou)造方法(fa)執(zhi)(zhi)行(xing)(xing)(xing)完(wan)畢,返回到Student.java類(lei)。先執(zhi)(zhi)行(xing)(xing)(xing)初始化塊,輸出//第(di)十行(xing)(xing)(xing)。再執(zhi)(zhi)行(xing)(xing)(xing)第(di)二個構(gou)(gou)造方法(fa),輸出//第(di)十一行(xing)(xing)(xing)。

