2013-11-24 99 views
3

有人能解釋一下爲什麼在這個片段中,對X.Y.Z的呼叫相當於C.Z? 調用X.Y.Z意味着: - 它訪問靜態類X 然後 - 屬性ý-of型C-(未類Y) 然後 - 用C屬性Ž導致輸出「生命是疼痛」。靜態Nestest類,靜態屬性訪問。腦筋急轉彎

但是爲什麼調用X.Y可以訪問屬性而不是類? 這背後的理論是什麼?

public class A { 
    public static class X { 
     public static class Y { 
      public static String Z = "life is good"; 
     } 
     public static C Y; 
    } 

    public static class C { 
     public static String Z = "life is pain"; 
    } 

    public static void main(String[] args) { 
     System.out.println(X.Y.Z); 
    } 
} 

謝謝您的時間

+3

這就是所謂的興趣很快就會消退「陰影「變量時'公共靜態CY'陰影'公共靜態類Y'。所以當你調用'XYZ'實際上你調用'X - >類型C的變量Y - >類C的靜態變量Z' –

+1

這段代碼讓我看起來很傻(花了很多時間來真正理解場景背後的東西)和是啊@AlexeyA。是對的 – exexzian

回答

1

靜態類和靜態屬性是完全兩個不同的東西。如你所做的那樣進行調用只能引用類變量。 class Y不是A的變量,而類成員C Y是。

靜態類實際上和其他類一樣。唯一的區別是它沒有自己的.java文件,它在邏輯上與包含的類相關。但就是這樣。 如果明天你從class A中取出class Y,沒有什麼會中斷(假設你改變了你在012xx之類做過的地方)。另一方面,變量public static C Y;class A的一部分。

0

因爲您有名稱衝突,所以如果您允許java編譯器通過使用構造函數來推斷正確的名稱(例如System.out.println(new X.Y().Z);它有效)。

+0

這不是JVM;它是編譯器。 –

+0

@MarkoTopolnik好的。我需要更多的咖啡。 –

2

它沒有什麼特別的有趣之處,它歸結於JLS指定的名稱解析過程中的優先順序。名稱X.Y不明確,必須優先選擇其中一個選項。

如果你是在血淋淋的細節真正感興趣,有關於這個問題的whole chapter in the JLS(我的猜測是,一旦你意識到什麼了馬蜂窩你已經打開了:)