类、变量、块、构造器、继承初始化顺序,终极解答
生活随笔
收集整理的這篇文章主要介紹了
类、变量、块、构造器、继承初始化顺序,终极解答
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自?類、變量、塊、構造器、繼承初始化順序,終極解答
最近發現微信群里面有些群友在討論類的初始化順序,如類的靜態變量、成員變量、靜態代碼塊、非靜態代碼塊、構造器,及繼承父類時,它們的初始化順序都是怎樣的,下面我通過例子來說明這個情況,以免被人誤導。
示例1:測試單類的初始化順序
public class ClassInitOrderTest { ? ?public static String staticField = "static field"; ? ?static {System.out.println(staticField);System.out.println("static block");} ? ?private String field = "member field"; ? ?{System.out.println(field);System.out.println("non-static block");} ? ?public ClassInitOrderTest() {System.out.println("constructor");} ? ?public static void main(String[] args) {new ClassInitOrderTest();} }程序輸出:
static field static block member field non-static block constructor可以得出以下結論:
靜態變量 > 靜態初始塊 > 成員變量 > 非靜態初始塊 > 構造器
示例2:測試類繼承的初始化順序
class Parent { ? ?private static String parentStaticField = "parent static field"; ? ?static {System.out.println(parentStaticField);System.out.println("parent static block");} ? ?private String parentField = "parent member field"; ? ?{System.out.println(parentField);System.out.println("parent non-static block");} ? ?public Parent() {System.out.println("parent constructor");} } public class Child extends Parent { ? ?private static String childStaticField = "child static field"; ? ?static {System.out.println(childStaticField);System.out.println("child static block");} ? ?private String childField = "child member field"; ? ?{System.out.println(childField);System.out.println("child non-static block");} ? ?public Child() {System.out.println("child constructor");} ? ?public static void main(String[] args) {new Child();} }程序輸出:
parent static field parent static block child static field child static block parent member field parent non-static block parent constructor child member field child non-static block child constructor可以得出以下結論:
父類靜態變量 > 父類靜態初始塊 > 子類靜態變量 > 子類靜態初始塊 > 父類成員變量 > 父類非靜態初始塊 > 父類構造器 > 子類成員變量 > 子類非靜態初始塊 > 子類構造器
示例3:測試成員變量、初始塊的初始化順序
從上面兩個例子可以看出,父類的靜態變量和靜態初始塊肯定是先于子類加載的。但同一個類中的靜態變量與靜態初始塊之間,成員變量與初始塊之間的順序一定是變量先于初始塊嗎?繼續演示!
public class TestOrder { ? ?private static A a = new A(); ? ?static {System.out.println("static block");} ? ?private static B b = new B(); ? ?public static void main(String[] args) {new TestOrder();} } class A {public A() {System.out.println("static field A");} } class B {public B() {System.out.println("static field B");} }程序輸出:
static field A static block static field B可以得出以下結論:
靜態變量A > 靜態初始塊 > 靜態變量B
所以,它們的在類中的順序就決定了它們的初始化順序,而不是變量一定會優先于初始塊。
總結
以上是生活随笔為你收集整理的类、变量、块、构造器、继承初始化顺序,终极解答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的宏变量,宏替换详解。
- 下一篇: Tomcat集群session复制与Or