加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...
類代碼塊和屬性的加載順序問題,不要以為靜態(tài)塊始終最先執(zhí)行了!
我們知道在一個(gè)類中,類的加載順序?yàn)?靜態(tài)代碼塊——>普通代碼塊——>構(gòu)造代碼塊,感覺靜態(tài)塊始終是最先初始化的,其實(shí)并不是,下面從幾個(gè)代碼的示例進(jìn)行學(xué)習(xí)。
public class FirstChildren {public static void main(String[] args) {new FirstChildren();}public FirstChildren() {System.out.println("構(gòu)造塊");}{System.out.println("普通代碼塊");}static {System.out.println("靜態(tài)代碼塊");} }代碼的執(zhí)行結(jié)果:靜態(tài)代碼塊 普通代碼塊 構(gòu)造塊如果這個(gè)類有父類如下:
public class Father {public Father() {System.out.println("父類構(gòu)造代碼塊");}{System.out.println("父類普通代碼塊");}static {System.out.println("父類靜態(tài)代碼塊");} }此時(shí)的子類:
public class FirstChildren1 extends Father {public static void main(String[] args) {new FirstChildren1();}public FirstChildren1() {System.out.println("子類構(gòu)造塊");}{System.out.println("子類普通代碼塊");}static {System.out.println("子類靜態(tài)代碼塊");} }執(zhí)行結(jié)果:父類靜態(tài)代碼塊 子類靜態(tài)代碼塊 父類普通代碼塊 父類構(gòu)造代碼塊 子類普通代碼塊 子類構(gòu)造代碼塊可以看出當(dāng)有父類的情況下的執(zhí)行順序如下:
父類靜態(tài)代碼塊——>子類靜態(tài)代碼塊——>
父類普通代碼塊——>父類構(gòu)造代碼塊——>
子類普通代碼塊——>子類構(gòu)造代碼塊
上面的代碼只是演示了類中代碼塊的加載順序,如果有屬性的話,類中的代碼和屬性的初始化順序可能跟你想的不太一樣
我們?cè)诟割愔性黾映蓡T屬性extFather,子類中增加成員屬性extChildren
//父類 public class Father {public Father() {System.out.println("父類構(gòu)造代碼塊");}{System.out.println("父類普通代碼塊");}private ExtFather extFather = new ExtFather();static {System.out.println("父類靜態(tài)代碼塊");} } //父類成員屬性 public class ExtFather {public ExtFather() {System.out.println("父類屬性代碼塊執(zhí)行");} } //子類 public class FirstChildren3 extends Father {public static void main(String[] args) {new FirstChildren3();}public FirstChildren3() {System.out.println("子類構(gòu)造代碼塊");}{System.out.println("子類普通代碼塊");}private ExtChildren extChildren = new ExtChildren();static {System.out.println("子類靜態(tài)代碼塊");} } //子類成員屬性 public class ExtChildren {public ExtChildren() {System.out.println("子類屬性代碼塊執(zhí)行");} }此時(shí)執(zhí)行子類的主函數(shù),執(zhí)行結(jié)果如下:父類靜態(tài)代碼塊 子類靜態(tài)代碼塊 父類普通代碼塊 父類屬性代碼塊執(zhí)行 父類構(gòu)造代碼塊 子類普通代碼塊 子類屬性代碼塊執(zhí)行 子類構(gòu)造代碼塊可以得出執(zhí)行結(jié)論;
父類靜態(tài)代碼塊——>子類靜態(tài)代碼塊——>
父類普通代碼塊或者父類屬性代碼塊(看代碼的先后順序)——>父類構(gòu)造代碼塊——>
子類普通代碼塊或者子類屬性代碼塊(看代碼的先后順序)——>子類構(gòu)造代碼塊
第一個(gè)例子用的FirstChildren1,第二個(gè)例子用的FirstChildren3,不用問,問就是我不喜歡FirstChildren2如果把上面的成員屬性,變成靜態(tài)的
//父類 public class Father {public Father() {System.out.println("父類構(gòu)造代碼塊");}{System.out.println("父類普通代碼塊");}private static ExtFather extFather = new ExtFather();static {System.out.println("父類靜態(tài)代碼塊");} } //父類成員屬性 public class ExtFather {public ExtFather() {System.out.println("父類屬性代碼塊執(zhí)行");} } //子類 public class FirstChildren3 extends Father {public static void main(String[] args) {new FirstChildren3();}public FirstChildren3() {System.out.println("子類構(gòu)造代碼塊");}{System.out.println("子類普通代碼塊");}private static ExtChildren extChildren = new ExtChildren();static {System.out.println("子類靜態(tài)代碼塊");} } //子類成員屬性 public class ExtChildren {public ExtChildren() {System.out.println("子類屬性代碼塊執(zhí)行");} }執(zhí)行結(jié)果又變成這樣:父類屬性代碼塊執(zhí)行 父類靜態(tài)代碼塊 子類屬性代碼塊執(zhí)行 子類靜態(tài)代碼塊 父類普通代碼塊 父類構(gòu)造代碼塊 子類普通代碼塊 子類構(gòu)造代碼塊可以得出執(zhí)行結(jié)論;
父類屬性代碼塊執(zhí)行或者父類靜態(tài)代碼塊(看代碼的先后順序)——>
子類靜態(tài)代碼塊或者子類屬性代碼塊(看代碼的先后順序)——>
父類普通代碼塊——>父類構(gòu)造代碼塊——>
子類普通代碼塊——>子類構(gòu)造代碼塊
通過上面的例子,能看出來,都是先靜態(tài)的,在普通代碼塊,最后才是構(gòu)造函數(shù)!!!!!!
感覺靜態(tài)塊都是最先初始化的,其實(shí)并不是!!!!
比如下面的代碼:
public class Other {public static Other o1 = new Other();public static Other o2 = new Other();{System.out.println("構(gòu)造塊");}static {System.out.println("靜態(tài)塊");}public static void main(String[] args) {Other other = new Other();} }執(zhí)行結(jié)果:構(gòu)造塊 構(gòu)造塊 靜態(tài)塊 構(gòu)造塊剛開始我對(duì)這個(gè)結(jié)果也是拒絕的,但是后來看了大神的解釋才明白,加載的時(shí)候不能單看靜態(tài)代碼塊,而是把靜態(tài)的部分當(dāng)成靜態(tài)域這個(gè)一個(gè)整體,靜態(tài)域包括靜態(tài)變量,靜態(tài)方法,靜態(tài)塊,加載的時(shí)候把他們看成一個(gè)整體。
那么代碼執(zhí)行的情況是:
紙上得來終覺淺,絕知此事要躬行~
類中代碼塊和屬性的加載順序問題,不要以為靜態(tài)塊始終最先執(zhí)行了
總結(jié)
以上是生活随笔為你收集整理的加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配电箱接线口诀_电路设计和家庭电路控制系
- 下一篇: 下运行maven命令_实话实说 | 这些