2012-12-04 152 views
3
class Host { 
    int x=2; 

    class Helper { 
     int x = 7; 
    } 

    public static void main(String[] args){ 
     Host ho = new Host(); 
     Helper he = ho.new Helper(); 
     System.out.println(ho.x); 
     System.out.println(he.x); 

    } 
} 

所以在這裏我得到預期的輸出訪問外部類變量通過內部類對象主要

2 
7 

現在我想問的是,比方說,我想訪問ho「從s xhe

I.e.我想在這裏的東西,它將打印我2通過輔助對象he

System.out.println(???); 

我知道有沒有用了這樣的事,我只是想澄清我的嵌套類的概念。 我想,這應該是可能的,因爲輔助對象he是那種「綁定」到主機對象ho。由於he也不是沒有可能ho。從助手類內部我可以做System.out.println(Host.this.x);,它的工作原理。我無法弄清楚如何從主內部做到這一點。

+0

你不能,沒有'Helper'的實例「生活」到'Host''H' – 2012-12-04 09:58:22

回答

1

正如已經被其他你不能回答指出,這樣的訪問。原因在於thisJLS #15.8.3

的關鍵字定義的方式,這可能僅在一個實例方法的正文中,實例初始化,或構造一起使用,或者在一個類的一個實例變量的初始值設定。 如果它出現在其他地方,則發生編譯時錯誤。

而且因爲你只能this訪問外圍實例(CF JLS #15.8.4),即只能在內部類中完成:

這是一個編譯時錯誤[調用C.this ]如果當前類不是類C或C本身的內部類。

0

Java基本概念,主機類可以訪問內部類變量x其中作爲反之亦然不可能的。你可以像@Nikita Beloglazov所說的那樣做。而是直接使用變量,不可能

+0

Hm。有趣。那麼我怎麼在另一個方向做呢?如何從'ho'訪問他的'x'? – user1265125

+0

你不能像@RC在你的評論中說的那樣 –

+0

哦,所以我無法做到這一點?我只能通過它們的獨立對象訪問它們的變量? – user1265125

0

您可以創建內部類方法,返回外部類:

class Helper { 
    int x = 7; 

    public Host outer() { 
     return Host.this; 
    } 
} 

// In main; 
System.out.println(he.outer().x); 

它類似於訪問xHelper但更普遍。

1

早在那時,在舊版本的Java中,您使用this$0作爲訪問外部實例而不是Host.this的方式。該規範已經改變,但現場仍然可以通過反射:

Field this$0 = he.getClass().getDeclaredField("this$0"); 
Host host = (Host) this$0.get(he); 
System.out.println(host.x); 

我不知道任何其他方式(除了修改Host類添加getXgetHost方法)。

現在,爲什麼不是這樣的可接入性沒有反映?我可以看到兩個可能的原因:

  • 他們忘
  • 來自外部的情況下打破封裝
+0

同樣的結論雖然我仍然不明白爲什麼... – assylias

+0

@assylias I假設它被認爲會違背封裝,也許會導致關於外地訪問權限的新問題。它看起來很像閉合如何保護其他一些語言的變量。 –