2012-04-05 76 views
12

以下代碼是合法轉發引用的情況嗎?如果是,爲什麼?Java法律轉發引用

public class MyClass 
{ 
    private static int x = getValue(); 
    private static int y = 5; 
    private static int getValue() 
    { 
    return y; 
    } 
    public static void main(String[] args) 
    { 
    System.out.println(x); 
    } 
} 

回答

19

上面的代碼是完全合法的Java。在Java中,靜態字段的初始化過程如下:首先,所有字段都設置爲其類型的默認值(0,falsenull),然後按照它們的聲明順序進行初始化。這意味着,上面的代碼是保證做到以下幾點:

  1. xy爲零,因爲這是爲int S中的默認值。
  2. 通過調用getValue()來初始化x,其讀取值y。由於y尚未初始化,它仍然有值0
  3. 初始化y到5

這意味着x將採取值0和y將值5此行爲便攜和保證。 You can see this here

希望這會有所幫助!

+0

如果那些不是靜態變量和方法,會是什麼情況? – Vibhor 2012-04-05 21:05:42

+2

我相信行爲是一樣的 - 初始化首先將所有東西都設置爲默認值,然後用指定的值初始化每個值,然後調用構造函數。 – templatetypedef 2012-04-05 21:06:19

+1

哪一個,順便說一句,是你不應該從構造函數調用非final(或private)方法的原因之一;對於某個人來說,這很容易覆蓋該方法,並且看到一個尚未構建的「this」,甚至看到未初始化的最終字段。 – yshavit 2012-04-05 21:26:48

5

你可以通過它編譯的事實來判斷它是否合法;與其他一些語言不同,Java沒有「未定義行爲」的概念。這裏發生的事情完全是拼寫出來的。它可能違反直覺,但它是特別合法的:你可以在初始化另一個靜態變量時從一個調用的方法初始化之前訪問一個靜態變量。直接從x的初始化訪問y的表面類似的情況下 - 即,

private static int x = y; 
private static int y = 5; 

具體禁止。沒有什麼強有力的理由 - 它就是這樣。

+0

如果變量是非靜態的,那該怎麼辦呢? – Vibhor 2012-04-05 21:09:18

+0

是的,它實際上是一樣的。列出的靜態規則略有不同,因爲對於類沒有實際的「構造函數」,但對象的初始化方式基本相同。例如,變量,初始值設定項和實例塊按照外觀順序預先分配給每個構造函數。對於靜態,初始化器和靜態塊按順序編譯成一個名爲'()'的方法。 – 2012-04-05 21:15:44

+0

有一個可以通過編譯器測試的程序,對於這樣的問題我很害怕。這是來自OCJP考試的模擬考試。我現在正在學習它,而這些愚蠢的問題完全沒有意義,它會嘲笑考試的意圖。 – 2013-01-29 10:52:47