2011-10-31 33 views
5
interface Test { 
public void test(); 
} 

public class TestMain { 
private String h = "AAA"; 

public static void main(String[] args) { 
    TestMain t = new TestMain(); 
} 

public TestMain() { 
    Test t = new Test() { 
     public void test() { 
      System.out.println(h); 
     } 
    }; 

    t.test(); 
} 

} 

上面的源代碼運行良好。Java匿名類和可訪問私有變量

但我認爲變量'h'應該從匿名類無法訪問。 我需要知道它爲什麼運作良好。

感謝您提前給予您的所有幫助!

回答

7

非靜態內部類的每個實例都有一個包含實例 - 通過存儲在內部類對象中的引用變量綁定到外部類的實例。通過該引用可用於內部類對象的封閉實例的所有成員。

編譯器負責添加該引用變量,當然還有一些特殊的訪問器函數,內部類對象可以使用該函數來獲取外部類對象的私有成員。您可以使用javap -c反彙編外部類來查看這些訪問器函數。

-1

嵌套類是其封閉類的成員。非靜態嵌套類(內部類)可以訪問封閉類的其他成員,即使它們被聲明爲私有。靜態嵌套類不能訪問封閉類的其他成員。

+1

靜態嵌套類可以訪問封閉類的私有靜態成員。 –

+0

這是正確的,我的意思是「不能訪問封閉類的非靜態成員」 – PaganSensei

+0

@SandeepRajeev:仍然不正確。給定一個封閉類的實例 - 也就是說,如果它接收一個作爲方法參數,或者創建它自己的一個 - 靜態嵌套類可以訪問該實例的私有成員。 –

1

用於確定可達性私有成員的基本規則是,根據section 6.6.1 of the Java Language Specification

[I] F中的部件或構造函數被聲明爲專用,則訪問被許可,當且僅當它發生在身體內包含成員或構造函數聲明的頂級類。