Java中的靜態(tài)塊語句、塊語句精研
[導讀]以下是一道筆試題:?
Java代碼??
package?com.example;??
??
public?class?Parent??
{??
????public?Parent()??
???
以下是一道筆試題:?
Java代碼?? package?com.example;?? ?? public?class?Parent?? {?? ????public?Parent()?? ????{?? ????????System.out.println("Parent>>>>>>>>>>>1");?? ????}?? ?? ????{?? ????????System.out.println("Parent>>>>>>>>>>>2");?? ????}?? ????static?? ????{?? ????????System.out.println("Parent>>>>>>>>>>>3");?? ????}?? }??
Java代碼?? package?com.example;?? ?? public?class?Child?extends?Parent?? {?? ????public?Child()?? ????{?? ????????System.out.println("Child>>>>>>>>>>>1");?? ????}?? ?? ????{?? ????????System.out.println("Child>>>>>>>>>>>2");?? ????}?? ????static?? ????{?? ????????System.out.println("Child>>>>>>>>>>>3");?? ????}?? ?? ????public?static?void?main(String[]?args)?? ????{?? ????????new?Child();?? ????}?? }??
請寫出上面程序的執(zhí)行結(jié)果。?
此題是考查靜態(tài)語句塊、語句塊以及構(gòu)造函數(shù)的執(zhí)行順序。?
分析:對象的初始化順序:首先執(zhí)行父類靜態(tài)的內(nèi)容,父類靜態(tài)的內(nèi)容執(zhí)行完畢后,接著去執(zhí)行子類的靜態(tài)的內(nèi)容,當子類的靜態(tài)內(nèi)容執(zhí)行完畢之后,再去看父類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行父類的非靜態(tài)代碼塊,父類的非靜態(tài)代碼塊執(zhí)行完畢,接著執(zhí)行父類的構(gòu)造方法;父類的構(gòu)造方法執(zhí)行完畢之后,它接著去看子類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行子類的非靜態(tài)代碼塊。子類的非靜態(tài)代碼塊執(zhí)行完畢再去執(zhí)行子類的構(gòu)造方法??傊痪湓挘o態(tài)代碼塊內(nèi)容先執(zhí)行,接著執(zhí)行父類非靜態(tài)代碼塊和構(gòu)造方法,然后執(zhí)行子類非靜態(tài)代碼塊和構(gòu)造方法。?
而且子類的構(gòu)造方法,不管這個構(gòu)造方法帶不帶參數(shù),默認的它都會先去尋找父類的不帶參數(shù)的構(gòu)造方法。如果父類沒有不帶參數(shù)的構(gòu)造方法,那么子類必須用supper關鍵子來調(diào)用父類帶參數(shù)的構(gòu)造方法,否則編譯不能通過。?
因此執(zhí)行結(jié)果是:?
Java代碼?? Parent>>>>>>>>>>>3?? Child>>>>>>>>>>>3?? Parent>>>>>>>>>>>2?? Parent>>>>>>>>>>>1?? Child>>>>>>>>>>>2?? Child>>>>>>>>>>>1
Java代碼?? package?com.example;?? ?? public?class?Parent?? {?? ????public?Parent()?? ????{?? ????????System.out.println("Parent>>>>>>>>>>>1");?? ????}?? ?? ????{?? ????????System.out.println("Parent>>>>>>>>>>>2");?? ????}?? ????static?? ????{?? ????????System.out.println("Parent>>>>>>>>>>>3");?? ????}?? }??
Java代碼?? package?com.example;?? ?? public?class?Child?extends?Parent?? {?? ????public?Child()?? ????{?? ????????System.out.println("Child>>>>>>>>>>>1");?? ????}?? ?? ????{?? ????????System.out.println("Child>>>>>>>>>>>2");?? ????}?? ????static?? ????{?? ????????System.out.println("Child>>>>>>>>>>>3");?? ????}?? ?? ????public?static?void?main(String[]?args)?? ????{?? ????????new?Child();?? ????}?? }??
請寫出上面程序的執(zhí)行結(jié)果。?
此題是考查靜態(tài)語句塊、語句塊以及構(gòu)造函數(shù)的執(zhí)行順序。?
分析:對象的初始化順序:首先執(zhí)行父類靜態(tài)的內(nèi)容,父類靜態(tài)的內(nèi)容執(zhí)行完畢后,接著去執(zhí)行子類的靜態(tài)的內(nèi)容,當子類的靜態(tài)內(nèi)容執(zhí)行完畢之后,再去看父類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行父類的非靜態(tài)代碼塊,父類的非靜態(tài)代碼塊執(zhí)行完畢,接著執(zhí)行父類的構(gòu)造方法;父類的構(gòu)造方法執(zhí)行完畢之后,它接著去看子類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行子類的非靜態(tài)代碼塊。子類的非靜態(tài)代碼塊執(zhí)行完畢再去執(zhí)行子類的構(gòu)造方法??傊痪湓挘o態(tài)代碼塊內(nèi)容先執(zhí)行,接著執(zhí)行父類非靜態(tài)代碼塊和構(gòu)造方法,然后執(zhí)行子類非靜態(tài)代碼塊和構(gòu)造方法。?
而且子類的構(gòu)造方法,不管這個構(gòu)造方法帶不帶參數(shù),默認的它都會先去尋找父類的不帶參數(shù)的構(gòu)造方法。如果父類沒有不帶參數(shù)的構(gòu)造方法,那么子類必須用supper關鍵子來調(diào)用父類帶參數(shù)的構(gòu)造方法,否則編譯不能通過。?
因此執(zhí)行結(jié)果是:?
Java代碼?? Parent>>>>>>>>>>>3?? Child>>>>>>>>>>>3?? Parent>>>>>>>>>>>2?? Parent>>>>>>>>>>>1?? Child>>>>>>>>>>>2?? Child>>>>>>>>>>>1





