2012-03-25 157 views
5

我知道,這是一個非常基本的主題,所以如果它是一個重複的問題,請提供參考。在Java中初始化的順序

說,有下面的代碼:

public class Point { 

    int x = 42; 
    int y = getX(); 

    int getX() { 
     return x; 
    } 

    public static void main (String s[]) { 
     Point p = new Point(); 
     System.out.println(p.x + "," + p.y); 
    } 
} 

它輸出:42,42

但是,如果我們改變變量的出現順序:

public class Point { 

    int y = getX(); 
    int x = 42; 

    int getX() { 
     return x; 
    } 

    public static void main (String s[]) { 
     Point p = new Point(); 
     System.out.println(p.x + "," + p.y); 
    } 
} 

它輸出: 42,0

我明白我在第二種情況下,情況可以被描述爲:「好的,我不知道返回的x值是什麼,但是有一些價值」。我不完全理解的是,x在這裏可能看不到它的價值。這是編譯時間和運行時間的問題嗎?提前致謝。

+1

檢查[JLS](http://docs.oracle.com/javase/specs/ jls/se7/html/jls-4.html#jls-4.12.5) – assylias 2012-03-25 23:48:13

回答

7

當您在Java中創建int時,它會自動初始化爲0。因此,第二個代碼所做的是創建兩個整數xy將它們都設置爲0,然後將y設置爲值x0然後將x設置爲值42

+0

謝謝,現在有道理。 – 2012-03-25 23:54:12

+0

@JohnDoe沒問題。 – twain249 2012-03-25 23:54:49

2

int具有0作爲默認值。

在編譯時
1

因此,編譯器生成指令預留用於x和y的空間(存儲器),並且它們的值設置爲0

在運行時,JVM填充Point對象(分配給它的內存)併爲x和y分配內存和初始值0。

然後,運行時初始化代碼開始執行並且y置爲0,然後x至42(在第二種情況下)