簡體   English   中英

在內部類中使用非最終局部變量

[英]Usage of a non-final local variable within an inner class

JLS 8.1.3為我們提供了關於未在內部類中聲明但在類中使用的變量的規則。

使用但未在內部類中聲明的任何局部變量,形式參數或異常參數必須聲明為final或者是有效的final(§4.12.4),否則在嘗試使用時會發生編譯時錯誤。

一個例子:

class A{
    void baz(){
        int i = 0;
        class Bar{ int j = i; }
    }

    public static void main(String[] args){
    }
}

DEMO

為什么編譯代碼? 我們在內部類中使用了非final的局部變量,該變量在那里沒有聲明。

可變i因為變量i的值不別處改性方法巴茲內部定義是effictively最后。 如果你改變它

void baz(){
        int i = 0;
        i = 2;
        class Bar{ int j = i; }
    }

代碼將無法編譯,因為變量i不再是有效的最終結果,但如果您只是聲明變量i並將其初始化為另一行,則代碼將編譯,因為該變量是有效的最終

  void baz(){
        int i;
        i = 2;
        class Bar{ int j = i; }
    }

i實際上是最終的,因為它永遠不會被修改。 正如您自己引用JLS一樣,內部類可以有效地使用最終變量。

因為ibaz沒有改變,所以i實際上是最終的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM