2012-08-31 25 views
5
public class Main { 
    public static void main(String[] args){ 
     System.out.println(X.Y.Z); 
    } 
} 

class X { 
    static class Y { 
     static String Z = "Result 1"; 
    } 
    static C Y = new C(); 
} 

class C { 
    String Z = "Result 2"; 
} 

有時輸出爲"Result 1",有時輸出爲"Result 2"。你能解釋爲什麼嗎?執行後不同的輸出主類

我正在使用JDK 1.6_33

+0

使用JDK 1.6.24,我每次都得到'Result 2'。 – mellamokb

+0

@mellamokb我也是。每次。 –

+1

我下載了JDK 1.6.33,編譯並運行了代碼片段20次。每一次都得到了'結果2'。 – mellamokb

回答

9

這是Java Puzzler#68 - 應該始終打印Result 2。報價:

事實證明,有是決定在這種情況下程序行爲的規則。當一個 變量和一個類型具有相同的名稱並且兩者都在作用域中時,變量名稱的優先級爲 [JLS 6.5.2]。據說變量名稱掩蓋了類型名稱[JLS 6.3.2]。同樣,變量和類型名稱可能會遮蓋軟件包名稱。這個規則確實很模糊,任何依賴它的程序都可能會讓讀者感到困惑。

+4

而任何人依靠這個編寫代碼都應該捲成焦油和羽毛。 – biziclop

+0

我在哪裏可以看到這個Java拼圖? – Ilya

+0

http://www.javapuzzlers.com/ – assylias