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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...
