static初始化只有在必要的時候才會進行。如果不創建一個 Table 對象,而且永遠都不引用Table.b1 或Table.b2,那么 static Bowl b1 和b2 永遠都不會創建。然而,只有在創建第一個Table 對象之后(或者發生了第一次static 訪問),它們才會創建。在那以后,static 對象不會重新初始化。初始化的順序是首先static(如果它們尚未由前一次對象創建過程初始化),接著是非static 對象。
class Table {static Bowl b1 = new Bowl(1);Table() {System.out.PRintln("Table()");}void f2(int marker) {System.out.println("f2(" + marker + ")");}static Bowl b2 = new Bowl(2);}
下屬的這段代碼僅執行一次——首次生成那個類的一個對象時,或者首次訪問屬于那個類的一個 static 成員時(即便從未生成過那個類的對象)。
class Spoon {static int i;static {i = 47;}
package demo;class Cup {Cup(int marker) {System.out.println("Cup(" + marker + ")");}void f(int marker) {System.out.println("f(" + marker + ")");}}class Cups {static Cup c1;static Cup c2;static {c1 = new Cup(1);c2 = new Cup(2);}Cups() {System.out.println("Cups()");}}public class ExplicitStatic {public static void main(String[] args) {System.out.println("Inside main()");Cups.c1.f(99); // (1)}static Cups x = new Cups(); // (2)static Cups y = new Cups(); // (2)}Cup(1)Cup(2)Cups()Cups()Inside main()f(99)以上代碼來自thinkinjava
輸出這個結果是因為,先走static變量,會走cups的static靜態塊,輸出1,2,然后輸出空,第二次new一個y的時候靜態塊直走一次,所以1,2不生成了,所以再打印一個空,再繼續走system
新聞熱點
疑難解答