java在初始化的時候也有很多講究,因為java中出現了類,所以在初始化的時候就有可能使用到創建新對象,所以,對於初始化的順序要求的比較嚴格,請看下面一個程序,是thinking in Java中的一個程序,被我稍加改編,這樣可以更好的說明幾個初始化的要點:
class Cup
{
Cup(int marker)
{
System.out.println("Cup(" + marker + ")");
}
void f(int marker)
{
System.out.println("f(" + marker + ")");
}
}
class Cups
{
static Cup c1=new Cup(1);
Cup c3=new Cup(3);
static Cup c2= new Cup(2);
Cups()
{
System.out.println("Cups()");
}
Cup c4=new Cup(4);
}
public class ExplicitStatic
{
Cups c=new Cups();
{
System.out.println("Hello");
}
public static void main(String[] args)
{
System.out.println("Inside main()");
Cups.c1.f(99);
ExplicitStatic x=new ExplicitStatic();
}
static Cups x = new Cups();
}
大家可以手動執行一下這個程序,考慮一下結果是什麼,然後參照下面的答案對照一下,看看是否正確:
Cup(1)
Cup(2)
Cup(3)
Cup(4)
Cups()
Inside main()
f(99)
Cup(3)
Cup(4)
Cups()
Hello
我總結了四個初始化的要點,如下:
1、如果有static,即靜態成員定義,首先初始化static的變量,如,在類Cups中c3在c2前面,可是在輸出的結果中,你可以發現,c2是在c3前執行的,這就是因為,所有的static都在第一時間被初始化。
2、Static只初始化一次,在第二次創建類的對象的時候,就不會去執行static的語句,如,在第二次執行new Cups()的時候,就只輸出了Cup(3)和Cup(4),顯然,static的兩個創建對象的語句沒有做。
3、變量的初始化在方法前。如,在Cups類中,方法Cups()在語句Cup c4=new Cup(4)之前,可是輸出結果的時候,打印的Cups()卻在Cup(4)之後。
4、在含有main的類中執行順序是先做static,然後就是main,而不是像其它類一樣,除了static就按順序做下來。如,在main函數中,如果去掉語句ExplicitStatic x=new ExplicitStatic(),則Cups c=new Cups()和System.out.println("hello")都不會執行。另外,留個小問題,如果去掉了System.out.println("hello")外的括號會怎麼樣呢?