2011-10-09 62 views
7

可能重複:
Why inner classes require 「final」 outer instance variables [Java]?
Why are only final variables accessible in anonymous class?方法本地內部類只能訪問最終的局部變量。爲什麼?

class Outer{ 
    private String x = "instance variable"; 
    void doStuff(){ 
     String z = "local variable"; 
     class Inner{ 
      public void seeOuter(){ 
      System.out.println("Outer x is : "+ x); 
      System.out.println("Local variable z is : " + z); //won't compile 
     } 
     } 
    } 
} 

標記局部變量z作爲最終解決了這個問題:

final String z = "local variable"; //Now inner object can use it. 


任何人都可以請解釋發生了什麼?

我確切地知道爲什麼它不能編譯的情況下,我想訪問非最終的局部變量。

即使方法完成並且局部變量超出範圍,是否允許局部變量最終保持活動狀態?

最終的局部變量是否存儲在堆而不是堆棧上?

回答

2

標記局部變量z作爲最終修復問題: 任何人都可以請解釋發生了什麼?

您有一個方法local類,它允許訪問創建範圍內的最終局部變量。

即使方法完成並且局部變量超出範圍,是否使局部變量fi​​nal允許它保持活動狀態?

最後意味着它不能被改變。沒有其他的。

最終的局部變量是否存儲在堆而不是棧中?

所有變量都分配在堆棧上,最後是否定。

我確切地知道爲什麼它不能編譯的情況下,我試圖訪問非最終的局部變量。

也許你應該考慮一下這個問題,因爲它對我來說根本就不是這樣。

嵌套類可以「訪問」最終變量,因爲它們被自動複製爲對象的字段。它不支持非final字段,因爲它們可以通過方法或類更改,並且不支持,因爲實際上有兩個不同的字段/變量。

+0

:但這裏的問題是爲什麼標記一個方法局部變量fi​​nal讓它可訪問? – Anu11

+0

@ Anu11我會再讀一遍最後一段。 ;) –

10

它們可以使用函數的局部變量和參數,但只能使用聲明爲final的函數,因爲本地類實例必須維護變量的單獨 副本,因爲它可能會使該函數超時。所以如同 不要在同一範圍內有兩個可修改變量與 同名的混淆,變量被強制爲 是不可修改的。

+1

「,因爲它可能出現的功能」,是新來的Java和無法理解這部分,請你解釋一下這種情況可能發生嗎?謝謝 – RVP

+2

提供內部類實例作爲方法參數傳遞和存儲爲另一個Object的實例變量。因此儘管方法變量在METHOD完成時死亡,但INNER類對象超出了方法 –

+0

「因爲本地類實例必須維護變量的單獨副本」 - 做本地類實例維護訪問該範圍內的所有變量?文檔中是否有任何內容支持此功能或任何測試程序?我的意思是我們如何知道本地內部類獲得這些局部變量的副本? – Solace

相關問題