首頁  >  文章  >  Java  >  Java類別的靜態成員、靜態程式碼區塊、普通成員、普通程式碼區塊、建構方法初始化執行的順序詳細說明

Java類別的靜態成員、靜態程式碼區塊、普通成員、普通程式碼區塊、建構方法初始化執行的順序詳細說明

高洛峰
高洛峰原創
2017-03-19 11:20:102124瀏覽

  今天閱讀《Java程式思想(第4版中文版)》,剛複習到類別中成員的初始化這一知識點。為了加深印象和給其他人一點參考,參考書中範例並加以修改得到以下程式碼:

檔名:HelloWorld.java

套件名稱:main

package main;
class Bowl {
    Bowl(int marker){
        System.out.println("Bowl("+marker+")");
    }
    void f1(int marker){
        System.out.println("f1("+marker+")");
    }
}
class Table{
    static Bowl bowl1 = new Bowl(1); 
    public Table() {
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2 (int marker){
        System.out.println("f2("+marker+")");
    }
    static Bowl bowl2 = new Bowl(2); 
}
class Cupboard{
    {
        System.out.println("Cupboard类普通代码块执行");
    }
    Bowl bowl3 = new Bowl(3); // 注意,此处不是静态成员
    static Bowl bowl4 = new Bowl(4);
    static{
        System.out.println("Cupboard类静态代码块执行");
    }
    public Cupboard() {
        // TODO Auto-generated constructor stub
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }
    void f3(int marker){
        System.out.println("f3("+marker+")");
    }
    static Bowl bowl5 = new Bowl(5);
}
public class HelloWorld  {
   public static void main(String args[]){
       System.out.println("Creating new Cupboard() in main");
       new Cupboard();
       table.f2(1);
       cupboard.f3(1);
   }
   static Table table = new Table();
   static Cupboard cupboard = new Cupboard();
}

下面讓我們來分析一下該程式的運行。

1. 首先java虛擬機器要執行main方法,必須先載入類別HelloWorld

2. 發現類別HelloWorld中含有靜態資料(只有靜態成員),開始初始化靜態成員
首先 
【1】 static Table table = new Table(); 所以需要載入Table類別。發現該類別含有靜態成員,根據定義的先後順序執行初始化操作
【2】static Bowl bowl1 = new Bowl(1); 輸出:Bowl(1)
【3】 static Bowl bowl2 = new Bowl( 2); 輸出:Bowl(2)
【4】建構子Table(),輸出:Table()和f1(1)

其次 
【1】 static Cupboard cupboard = new Cupboard(); 所以需要載入Cupboard類別。發現該類別含有靜態資料(包括靜態成員和靜態程式碼區塊),根據二者定義的先後順序執行初始化操作
【2】 static Bowl bowl4 = new Bowl(4); 輸出:Bowl(4)
【3】 
  static{
    System.out.println("Cupboard類別靜態程式碼區塊執行");
  }
  ic輸出:Cupboard類別執行程式碼區塊執行程式碼區塊執行Bowl bowl5 = new Bowl(5); 輸出:Bowl(5)
靜態成員初始化後,透過new產生
物件。發現類別中含有成員定義時賦值與普通程式碼區塊,根據二者定義的先後順序執行初始化操作【1】
   {
    System.out.println("Cupboard類別普通程式碼區塊執行" );
   }
   輸出:Cupboard類別普通程式碼區塊執行
【2】 Bowl bowl3 = new Bowl(3); 輸出:Bowl(3)
【3】 建構子Cupboard(),建構子 程式碼輸出:Cupboard()和f1(2)

3. 進入main方法

【1】 System.out.println("Creating new Cupboard() in main"); 輸出:Creating new Cupboard( ) in main
【2】 new Cupboard(); 發現Cupboard類別中含有成員定義時賦值和普通程式碼區塊,根據二者定義的先後順序執行初始化操作,輸出:Cupboard類別普通程式碼區塊執行和Bowl( 3)
【3】建構子Cupboard(),輸出:Cupboard()和f1(2)
【4】 table.f2(1); 輸出:f2(1)
【5】 cupboard .f3(1); 輸出:f3(1)
綜上所述,程式的輸出結果為:
Bowl(1)
Bowl(2)
Table()
f1 (1)
Bowl(4)
Cupboard類別靜態程式碼區塊執行
Bowl(5)
Cupboard類別普通程式碼區塊執行
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Cupboard類別普通程式碼區塊執行
Bowl(3)
Cupboard()
f1(2)
f2(1 )
f3(1)

java類別資料的初始化總結如下:

1. 靜態成員和靜態程式碼區塊依照定義的先後順序執行初始化

  這裡要注意一點就是:靜態程式碼執行的前提是java虛擬機器要先載入這個類,而且靜態資料只會初始化一次。當首次產生一個類別的物件或首次存取屬於該類別的靜態資料成員時,該類別就會被載入了。

2. 普通成員定義處賦值與普通程式碼區塊依定義的先後順序執行初始化

#3. 最後才是

建構方法初始化#

以上是Java類別的靜態成員、靜態程式碼區塊、普通成員、普通程式碼區塊、建構方法初始化執行的順序詳細說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn