java中子類繼承父類程序執(zhí)行順序問題
Java中,new一個類的對象层扶,類里面的靜態(tài)代碼塊箫章、非靜態(tài)代碼、無參構(gòu)造方法镜会、有參構(gòu)造方法檬寂、類的一般方法等部分,它們的執(zhí)行順序相對來說比較簡單戳表,用程序也很容易驗證桶至。比如新建一個測試父類。
public class FatherTest {
private String name;
FatherTest(){
System.out.println("--父類的無參構(gòu)造函數(shù)--");
}
FatherTest(String name){
this.name=name;
System.out.println("--父類的有參構(gòu)造函數(shù)--"+this.name);
}
static{
System.out.println("--父類的靜態(tài)代碼塊--");
}
{
System.out.println("--父類的非靜態(tài)代碼塊--");
}
public void speak(){
System.out.println("--父類的方法--");
}
}
加入一個main程序后
public static void main(String[] args) {
System.out.println("--父類主程序--");
FatherTest father=new FatherTest("父親的名字");
father.speak();
}
執(zhí)行結(jié)果為:
--父類的靜態(tài)代碼塊--
--父類主程序--
--父類的非靜態(tài)代碼塊--
--父類的有參構(gòu)造函數(shù)--父親的名字
--父類的方法—
可以很明顯的看出來執(zhí)行順序:靜態(tài)代碼塊—主程序—非靜態(tài)代碼塊—構(gòu)造函數(shù)—一般方法匾旭。
如果加入子類的繼承以后镣屹,情況就會變得復雜些。比如我們再新建一個測試子類价涝。
public class SonTest extends FatherTest {
private String name;
static{
System.out.println("--子類的靜態(tài)代碼塊--");
}
{
System.out.println("--子類的非靜態(tài)代碼塊--");
}
SonTest(){
System.out.println("--子類的無參構(gòu)造函數(shù)--");
}
SonTest(String name){
this.name=name;
System.out.println("--子類的有參構(gòu)造函數(shù)--"+this.name);
}
@Override
public void speak(){
System.out.println("--子類Override了父類的方法--");
}?
}
然后再加入一個main函數(shù)
public static void main(String[] args) {
System.out.println("--子類主程序--");
FatherTest father=new FatherTest("父親的名字");
father.speak();
SonTest son=new SonTest("兒子的名字");
son.speak();
}
執(zhí)行結(jié)果為:
--父類的靜態(tài)代碼塊--
--子類的靜態(tài)代碼塊--
--子類主程序--
--父類的非靜態(tài)代碼塊--
--父類的有參構(gòu)造函數(shù)--父親的名字
--父類的方法--
--父類的非靜態(tài)代碼塊--
--父類的無參構(gòu)造函數(shù)--
--子類的非靜態(tài)代碼塊--
--子類的有參構(gòu)造函數(shù)--兒子的名字
--子類Override了父類的方法--
加入了子類以后女蜈,執(zhí)行順序有了新的變化,我們可以總結(jié)一下色瘩。首先第一部分執(zhí)行的是父類的靜態(tài)代碼塊—子類的靜態(tài)代碼塊—主程序伪窖。這一部分都是執(zhí)行一次,與建立多少對象沒有關(guān)系居兆。第二部分new了一個父類對象覆山,并調(diào)用了方法。執(zhí)行了它的非靜態(tài)代碼塊—構(gòu)造函數(shù)—一般方法泥栖。第三部分new了一個子類的對象簇宽,并調(diào)用了方法。執(zhí)行順序為父類的非靜態(tài)代碼塊—父類的無參構(gòu)造函數(shù)吧享,然后是子類的非靜態(tài)代碼塊—子類構(gòu)造函數(shù)—子類的方法晦毙。