2013-07-10 184 views
12

在內部類中,外部類的變量是可訪問的,但方法的局部變量不是。我瞭解一個方法的局部變量不可訪問的部分,但我想知道爲什麼可以訪問外部類變量?在內部類中訪問外部類變量

我的理解是,由於內部類與外部類綁定,因此只要父級可用,子級可以訪問其父級變量。我對麼?

+1

靜態內部類還是非靜態的? –

+2

@DuncanJones:內部類總是非靜態的。看看這裏.. http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html –

+1

@VishalK謝謝,我已經錯誤地調用嵌套類*內部類多年。哎呦! –

回答

28

假設你的外部類名爲Outer,從內部類(非靜態)的範圍,Outer.this.foo得到的字段。

例如,

Outer.this.foo=new ArrayList<>(); 

其中外層是類的名稱和標識foo領域。

您也可以直接抓住它作爲foo=new Baz(),但如果由於陰影導致命名衝突,它會選擇內部字段。

如果它是一個靜態內部類,你需要一個明確的實例:

outerInstance.foo=new ArrayList<>(); 

,或者訪問該字段是靜態的,訪問它像往常一樣:

Outer.staticFoo=new ArrayList<>(); 
+0

嗨,感謝您的回覆,這裏我的問題是如果內部類和外部類在某個時候使用該變量可能會有併發問題的機會。但是,內部類使用變量作爲一個類的兩個方法use.so,我們應該需要使用同步來處理這個內部類。 – kiran

+1

@ user5不,沒有超出任何其他情況下需要做的同步。內部和外部類不會導致創建新線程。 – hexafraction

0

答:由於詞法範圍的原因,java中的外部類變量是可訪問的。

什麼是詞法範圍?

按創作代碼的順序定義的作用域。假設你的班級結構如下

OuterMost 
    --Inner 
    --InnerMost 

然後最內層的類將能夠訪問內層和外層的變量。