java 初始化順序

來源:互聯網
上載者:User

標籤:

java 變數類型如下:

執行個體變數;

類變數;

初始化途經如下:

執行個體變數

  --聲明時,初始化;

  --非靜態初始化塊內,初始化;

  --建構函式內,初始化;

執行個體1:

public class bean1 {int d;int e;int c;int b;int f;{c = 3;}int a = 1;{b = 2;}public bean1() {d = 4;f = 5;e = 6;}public int geta() {return a;}}

javap -c bean1.class 查看反組譯碼代碼如下:

Compiled from "bean1.java"public class initialization.bean1 {  int d;  int e;  int c;  int b;  int f;  int a;  public initialization.bean1();    Code:       0: aload_0       1: invokespecial #1                  // Method java/lang/Object."<init>":()V       4: aload_0       5: iconst_3  //初始化c       6: putfield      #2                  // Field c:I       9: aload_0      10: iconst_1  //初始化a        11: putfield      #3                  // Field a:I      14: aload_0      15: iconst_2  //初始化b      16: putfield      #4                  // Field b:I      19: aload_0      20: iconst_4  //初始化d      21: putfield      #5                  // Field d:I      24: aload_0      25: iconst_5      26: putfield      #6                  // Field f:I      29: aload_0      30: bipush        6      32: putfield      #7                  // Field e:I      35: return  public int geta();    Code:       0: aload_0       1: getfield      #3                  // Field a:I       4: ireturn}

結論:執行個體變數的初始化均在public initialization.bean1()當中完成,無論是在聲明時直接初始化,還是在代碼塊當中初始化,本質均在建構函式裡面進行初始化,在建構函式當中的初始化順序取決於在 定義直接初始化和代碼塊初始化中的順序。

類變數

  --聲明時,初始化;

  --靜態初始化塊內,初始化;

執行個體2:

package initialization;public class bean2 {static int d;static int e = 5;static int c;int b;int f;int a = 1;static {c = 3;System.out.println("hello,static");}{b = 2;System.out.println("hello");}static {d = 4;}public bean2() {f = 6;}public int geta() {return a;}}

建立bean2執行個體時,輸出如下:

hello,statichello

靜態代碼塊是主動執行的,需要在項目啟動的時候就初始化;

javap -c bean2.class 查看反組譯碼代碼如下:

Compiled from "bean2.java"public class initialization.bean2 {  static int d;  static int e;  static int c;  int b;  int f;  int a;  public initialization.bean2();    Code:       0: aload_0       1: invokespecial #1                  // Method java/lang/Object."<init>":()V       4: aload_0       5: iconst_1//初始化a       6: putfield      #2                  // Field a:I       9: aload_0      10: iconst_2//初始化b      11: putfield      #3                  // Field b:I      14: aload_0      15: bipush        6      17: putfield      #4                  // Field f:I      20: return  public int geta();    Code:       0: aload_0       1: getfield      #2                  // Field a:I       4: ireturn  static {};    Code:       0: iconst_5//初始化e       1: putstatic     #5                  // Field e:I       4: iconst_3//初始化c       5: putstatic     #6                  // Field c:I       8: iconst_4//初始化d       9: putstatic     #7                  // Field d:I      12: return}

結論:  執行個體變數的初始化均在public initialization.bean2()當中完成,無論是在聲明時直接初始化,還是在代碼塊當中初始化,本質均在建構函式裡面進行初始化,在建構函式當中的初始化順序取決於在 定義直接初始化和代碼塊初始化中的順序;

   類變數在static {}中完成,且初始順序以代碼中順序為主,類變數在執行個體變數前執行;

關於java final可以查看:http://www.cnblogs.com/dolphin0520/p/3736238.html

java 初始化順序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.