Java類中靜態成員的初始化
阿新 • • 發佈:2019-01-09
//: initialization/StaticInitialization.java
// Specifying initial values in a class definition.
/*
* 2018年3月20日10:09:27
* 程式碼位置: java程式設計思想 P95
*
* 程式碼片目的,為了說明:
* 無論建立多少個物件,靜態資料都只佔用一份儲存區域。
* 而且static關鍵字不能應用於區域性變數。
* 由程式碼執行的結果,可以得到如下的分析:
* 在呼叫StaticInitialization類的static main()函式時,會首先載入StaticInitialization
* 類內定義的成員,由執行結果看出,先載入了靜態成員table, Table型別,
* 此時,進入Table類載入靜態成員bow1, bow2,然後執行Table()構造器
* 然後載入了靜態成員Cupboard cupboard, 執行結果如下:
* Bow(4)
* Bow(5)
* Bow(3)
* Cupboard()構造器
* 可以看出,在類中既有普通成員,又有static成員時,會先執行static成員。
* 而在main函式中呼叫new Cupboard()時,因為已經載入過該類,
* 所以靜態成員不再初始化,而普通成員每個物件各有一份,所以
* 再次初始化了Bow(3)....
*
* */
import static net.mindview.util.Print.*; class Bowl { Bowl(int marker) { print("Bowl(" + marker + ")"); } void f1(int marker) { print("f1(" + marker + ")"); } } class Table { static Bowl bowl1 = new Bowl(1); Table() { print("Table()"); bowl2.f1(1); } void f2(int marker) { print("f2(" + marker + ")"); } static Bowl bowl2 = new Bowl(2); } class Cupboard { Bowl bowl3 = new Bowl(3); static Bowl bowl4 = new Bowl(4); Cupboard() { print("Cupboard()"); bowl4.f1(2); } void f3(int marker) { print("f3(" + marker + ")"); } static Bowl bowl5 = new Bowl(5); } public class StaticInitialization { public static void main(String[] args) { print("Creating new Cupboard() in main"); new Cupboard(); print("Creating new Cupboard() in main"); new Cupboard(); table.f2(1); cupboard.f3(1); } static Table table = new Table(); static Cupboard cupboard = new Cupboard(); } /* Output: Bowl(1) Bowl(2) Table() f1(1) Bowl(4) Bowl(5) Bowl(3) Cupboard() f1(2) Creating new Cupboard() in main Bowl(3) Cupboard() f1(2) Creating new Cupboard() in main Bowl(3) Cupboard() f1(2) f2(1) f3(1) *///:~