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