標籤:java編程思想 待用資料初始化 初始化順序為先靜態對象後非靜態對象
無論建立多少個對象,待用資料永遠只佔用一份儲存空間。static關鍵字不能應用於局部變數,因此它只能作用於域。如果一個域是靜態基本類型域,且沒有對它進行初始化,那麼它就會獲得基本類型的標準初值,而如果它是一個對象的引用,則預設初始值為null。例子如下:
package test;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);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{Bowl bowl3=new Bowl(3);static Bowl bowl4=new Bowl(4);Cupboard(){System.out.println("Cupboard()");bowl4.f1(2);}void f3(int marker){System.out.println("f3("+marker+")");}static Bowl bowl5=new Bowl(5);}public class Static {public static void main(String args[]){System.out.println("Creating new Cupboard() in main");new Cupboard();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();}
Bowl類的引入可以看到類的建立。而Table類和Cupboard類在它們的類定義中加入了Bowl類型的待用資料成員。注意,在待用資料成員定義之前,Cupboard類先定義了一個Bowl類型的非待用資料成員bowl3。
輸出結果:
由輸出可見,
靜態初始化只在必要時刻才會進行,如果不建立Table對象,也不引用Table.bowl1或Table.bowl2,那麼靜態Bowl bowl1和bowl2永遠不會被建立。
只有在第一個Table對象被建立(或第一次訪問待用資料)的時候,它們
才會被初始化。
此後,靜態對象
不會再被初始化。
從輸出結果可知,初始化的順序是先靜態對象 (前提是它們尚未因前面的對象建立而初始化) 而後是非靜態對象。
JAVA編程思想(第4版) 待用資料的初始化