|
java類中代碼執(zhí)行順序 首先,沒有學(xué)java或者不知道類繼承的,可以不用浪費(fèi)時間樂,直接左上角,看多了有害。 public class HelloWorld { private int age; private String name; private String WorkNumber; public HelloWorld(){} public HelloWorld(String bb) { System.out.println('父類構(gòu)造函數(shù)開始執(zhí)行'); } { System.out.println('父類非靜態(tài)代碼塊執(zhí)行'); } static{ System.out.println('父類靜態(tài)代碼塊執(zhí)行'); } void run() { System.out.println('正常方法執(zhí)行'); } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public String getWorkNumber() { return WorkNumber; } public void setWorkNumber(String WorkNumber) { this.WorkNumber=WorkNumber; } public static void main(String[] args){ System.out.println('main方法執(zhí)行'); HelloWorld demo=new HelloWorld('bb'); demo.run(); } } 執(zhí)行結(jié)果如下圖: 這張圖我們可以看到順序是:靜態(tài)代碼塊 main方法 非靜態(tài)代碼塊 構(gòu)造方法(我口胡了,你們隨意) 但是后來我分成兩個類之后順序又變了(這也是我為什么發(fā)日志的原因,以前都沒注意這個),所以這個說說相當(dāng)于是一個筆記性質(zhì),純粹我放飛自我,請自帶B數(shù)。 兩個類的情況: HelloWorld.class: package exclass; public class HelloWorld { private int age; private String name; private String WorkNumber; public HelloWorld(){} public HelloWorld(String bb) { System.out.println('父類構(gòu)造函數(shù)開始執(zhí)行'); } { System.out.println('父類非靜態(tài)代碼塊執(zhí)行'); } static{ System.out.println('父類靜態(tài)代碼塊執(zhí)行'); } void run() { System.out.println('正常方法執(zhí)行'); } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public String getWorkNumber() { return WorkNumber; } public void setWorkNumber(String WorkNumber) { this.WorkNumber=WorkNumber; } } helloworld1.class:package exclass; public class helloworld1 { public static void main(String[] args){ System.out.println('main方法執(zhí)行'); HelloWorld HW=new HelloWorld('BB'); HW.run(); } } 運(yùn)行截圖如下:順序變?yōu)椋?main方法 靜態(tài)代碼塊 非靜態(tài)代碼塊 構(gòu)造方法 run方法 這個問題其實(shí)也不難理解,但是容易犯錯誤,首先第一個代碼中我們是在類的內(nèi)部用的主方法,對于一個類而言首先是對靜態(tài)進(jìn)行處理,然后再執(zhí)行相應(yīng)代碼,因此優(yōu)先執(zhí)行了靜態(tài)代碼塊然后執(zhí)行main,而第二份代碼中因?yàn)槭瞧渌愔型ㄟ^對象去調(diào)用HelloWorld,因此是main置前,實(shí)際上是 (helloworld1的相關(guān)預(yù)先執(zhí)行) main方法 靜態(tài)代碼塊 非靜態(tài)代碼塊 構(gòu)造方法 run方法,兩個代碼都沒得問題. 那么講遠(yuǎn)一點(diǎn),假設(shè)我們這有一個父類,一個子類。在子類執(zhí)行的時候,父子類的處理順序是什么呢?(SOLO父子局) 首先,子類數(shù)據(jù)是繼承自父類的,因此在子類調(diào)用時會先調(diào)用父類,那么就很好理解了,放上如下代碼: HelloWorld.class: package exclass; public class HelloWorld { public int age; public String name; public String WorkNumber; public HelloWorld(){} public HelloWorld(String bb) { System.out.println('父類構(gòu)造方法開始執(zhí)行'); } { System.out.println('父類非靜態(tài)代碼塊執(zhí)行'); } static{ System.out.println('父類靜態(tài)代碼塊執(zhí)行'); } void run() { System.out.println('父類一般方法執(zhí)行'); } public int getAge(){ return age; } public void setAge(int age){ this.age=age; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public String getWorkNumber() { return WorkNumber; } public void setWorkNumber(String WorkNumber) { this.WorkNumber=WorkNumber; } } chilclass.class:package exclass; public class chilclass extends HelloWorld{ public chilclass(){ System.out.println('子類構(gòu)造方法執(zhí)行'); } static{ System.out.println('子類靜態(tài)代碼塊執(zhí)行'); } { System.out.println('子類非靜態(tài)代碼塊執(zhí)行'); } @Override void run(){ System.out.println('子類一般方法執(zhí)行'); } public static void main(String[] args){ System.out.println('main方法執(zhí)行'); chilclass ch=new chilclass(); ch.run(); } } 總而言之......你以為是標(biāo)準(zhǔn)結(jié)局其實(shí)是還有情況噠?。ǚ浅O胝f的臺詞-1),我岸邊黃某最喜歡對自以為是的猴子說NO(非常想說的臺詞-2) 一、通過子類調(diào)用了父類的靜態(tài)字段,子類不會被初始化 二、類作為數(shù)組的組件類型不會觸發(fā)類初始化 三、常量池引用也會導(dǎo)致不初始化類 用大白話講:我從金庫拿錢走金庫還能像NPC一樣每天十二點(diǎn)刷新不成 |
|
|