2013-11-04 41 views
0

當嵌套類與封閉類的靜態成員共享名稱時,是否有任何方法從封閉類訪問嵌套類的靜態成員?例如:當嵌套類與封閉類的靜態成員共享一個名稱時,訪問嵌套類的靜態成員?

package a; 

class a { 
    static Object b; 

    static class b { 

     static Object foo; 
    } 

    static Object needAccessToFoo; 

    static { 
     // can I access foo? 
    } 

} 

b(相對於所述構件b)可以當經由a(或[b.]b.a)被用作類型來訪問。而foo可以用作爲這樣的嵌套類b的實例訪問:

static { 
    [a.][a.]b bar = new b(); 
    needAccessToFoo = bar.foo; 
} 

然而,由於b嵌套類而不是內部類,它留下一個懷疑是否有不通過bbar引用的對象)的實例靜態引用foo的正確方法。更不用說通過一個對象訪問一個靜態成員通常被認爲是不好的做法。

+0

我得到「java:class a已經在軟件包中定義了」爲什麼你會爲一個類使用小寫名字? –

+0

@PeterLawrey我改變了例子編譯。 – dcow

+0

你可以改變它,所以它符合Java編碼約定,類爲'B',字段爲'b'? ;) –

回答

1

此問題被稱爲遮擋。在上下文在那裏它可以潛在地是 解釋爲變量,類型,或一個包的名稱可能發生The JLS states

一個簡單的名稱。在這些 的情況下,§6.5的規則指定變量將優先選擇 而不是某個類型,並且將優先選擇一個類型爲 的包。因此,有時可能不可能通過其簡單名稱引用可見類型或包裝聲明。我們說 這樣的聲明是模糊的。

將不可能訪問foo

static初始化塊的上下文中,有兩個名字爲b的東西。由於上述規則,使用該衝突名稱時始終選擇該變量。使用包含類型對變量進行限定,a.b不會更改任何內容,因爲變量爲static,因此可通過該引用進行訪問。

+0

粗體文本確實說*簡單*名稱。我認爲這意味着沒有*完全合格*的名字?在這種情況下,暗示會存在一些你無法訪問引用的情況,這似乎不太可能(因此我的問題)。 – dcow

+0

@大衛是的,有些情況下你將無法訪問參考。這是其中的一種情況。請注意,您可以在'b'內訪問'foo'。 –

0

是因爲一切是靜態的,a在你static塊的範圍,你可以這樣做:

static { Object foo2 = a.foo; // can I access foo? }

您將需要重新命名外類,但是爲了防止名稱衝突。否則,編譯器將如何知道你指的是哪個a

+0

是的抱歉,我剛剛編輯它,所以它編譯 – dcow