2013-03-18 46 views
3

我是Java新手,幾天以來一直在做一些基本編碼。今天,在處理變量和內部類時,我在使用innerclass中的非最終變量時卡住了。在內部類中使用非最終變量

我使用TestNG的框架,對我的工作,所以這裏是我想的情況下,

=========

public class Dummy extends TestNG { 
    @Override 
    public void setUp() throws Exception { 
     log.error("Setup Goes here"); 
    } 

    @Override 
    public void test() throws Exception { 
     String someString = null; 
     try { 
     someString = "This is some string"; 
     } catch (Exception e) { 
     log.error(e.getMessage()); 
     } 
     Thread executeCommand = new Thread(new Runnable() { 
      @Override 
      public void run() {  
       try { 
        runComeCommand(someString, false); <=====ERROR LINE 
       } catch (Exception e) { 
        log.error(e.getMessage()); 
       } 
      } 
     }); 
    } 

    @Override 
    public void cleanUp() throws Exception { 
    } 
} 

======= ===

當我寫上面的代碼時,它會拋出一個錯誤,說「不能引用內部類中的非最終變量」。所以我實現了eclips提供的建議之一,即在父類中聲明someString變量。現在代碼看起來像這樣,

==========

public class Dummy extends TestNG { 
    String someString = null; <=====Moved this variable from test() to here 
    @Override 
    public void setUp() throws Exception { 
     log.error("Setup Goes here"); 
    } 
    @Override 
    public void test() throws Exception { 
       <same code goes here> 
    } 

    @Override 
    public void cleanUp() throws Exception { 
    } 
} 

==========

現在,它沒有顯示出任何錯誤文摘。 我想知道,爲什麼它現在接受內部類的變量,即使它不是最終的。它不應該以相同的錯誤失敗嗎?現在這個工作嗎?任何幫助都會很棒。

+1

可能重複http://stackoverflow.com/questions/11316954/inner-class-non -final-variable-java) – 2013-03-18 14:42:47

回答

2

在您的第一個示例中someStringtest中的局部變量。您不能引用非最終局部變量,因爲內部類將無法觀察對該值的更改。通過聲明該變量爲final,附加引用保留在內部類中(並且該變量的值在創建實例時已知)。

在第二個示例中someString不是局部變量而是實例一。內部類可以從容器對象引用該變量。

+0

字段是變量。 – 2013-03-18 14:49:46

+0

@ AndyThomas-Cramer好點,固定。 – Javier 2013-03-18 14:54:41

+0

非常感謝您澄清我的疑問。 – 2013-03-19 09:05:32

2

在第二種情況下,變量是一個字段,其生存期與其包含的對象相同。

在第一種情況下,該變量對於該方法是本地的。它的生命週期可能比在該方法中創建的匿名類實例更短。創建匿名類實例時需要其值的副本。

0

如您所見,Java編譯器不會讓您引用內部類中不是最終的瞬態變量。你可以參考你的變量,Eclipse建議你創建。這是通過Java設計的。你實際上是在你的內部類中引用這個類變量,而不是你的瞬態變量。

你可能想在最後的變量和內部類here讀了

[內部類的非final的變量的Java(的
相關問題