日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类、变量、块、构造器、继承初始化顺序,终极解答

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类、变量、块、构造器、继承初始化顺序,终极解答 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自?類、變量、塊、構造器、繼承初始化順序,終極解答

最近發現微信群里面有些群友在討論類的初始化順序,如類的靜態變量、成員變量、靜態代碼塊、非靜態代碼塊、構造器,及繼承父類時,它們的初始化順序都是怎樣的,下面我通過例子來說明這個情況,以免被人誤導。

示例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

所以,它們的在類中的順序就決定了它們的初始化順序,而不是變量一定會優先于初始塊。


總結

以上是生活随笔為你收集整理的类、变量、块、构造器、继承初始化顺序,终极解答的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。