今天閱讀《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)
【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類別的靜態成員、靜態程式碼區塊、普通成員、普通程式碼區塊、建構方法初始化執行的順序詳細說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!