先初始化主類中的靜態數據,如果要用其他類來定義對象,則初始化對應的其他類。 實例化對象時,先初始化定義為static的數據,再初始化定義為非static的數據,最後調用構造函數。 通過一個小程式,瞭解靜態數據是如何初始化的: 初始化順序:要執行main,必須先載入StaticInitializati ...
先初始化主類中的靜態數據,如果要用其他類來定義對象,則初始化對應的其他類。
實例化對象時,先初始化定義為static的數據,再初始化定義為非static的數據,最後調用構造函數。
通過一個小程式,瞭解靜態數據是如何初始化的:
//: initialization/StaticInitialization.java // Specifying initial values in a class definition. 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) */// :~
初始化順序:要執行main,必須先載入StaticInitialization類,然後其靜態域table和cupboard被初始化,這將導致它倆對應的類(Table,Cupboard)也被載入;
Table類和Cupboard類含有Bowl類的靜態對象,這會導致Bowl類被載入;
這樣,在這個特殊的程式中,所有類在main()開始之前就都被載入了。但實際情況通常並非如此,因為在典型的程式中,不會像在本例中所做的那樣,將所有的事物都通過static聯繫起來。
構造函數沒有使用static關鍵字,是隱式聲明為static的。