內部類為什麼必須引用final區域性變數

2021-08-31 22:08:38 字數 552 閱讀 9539

在方法中建立內部匿名類時,一般是作為callback介面的實現而建立的,可能方法已經執行完了區域性變數生命週期結束了,之後如果callback觸發了,就可能引起變數引用丟失等記憶體訪問不一致。

而加上final後,編譯器是這樣處理內部類的。如果這個外部區域性變數是常量,則在內部類**中直接用這個常量。如果是類的例項,則編譯器將產生乙個內部類的構造引數,將這個final變數傳到內部類裡,這樣即使外部區域性變數無效了,還可以使用。

內部類並不是直接呼叫方法傳進來的引數,而是內部類將傳進來的引數通過自己的構造器備份到了自己的內部,自己內部的方法呼叫的實際是自己的屬性而不是外部類方法的引數。

這樣理解就很容易得出為什麼要用final了,因為兩者從外表看起來是同乙個東西,實際上卻不是這樣,如果內部類改掉了這些引數的值也不可能影響到原引數,然而這樣卻失去了引數的一致性,因為從程式設計人員的角度來看他們是同乙個東西,如果程式設計人員在程式設計的時候在內部類中改掉引數的值,但是外部呼叫的時候又發現值其實沒有被改掉,這就讓人非常的難以理解和接受,為了避免這種尷尬的問題存在,所以編譯器設計人員把內部類能夠使用的引數設定為必須是 final來規避這種莫名其妙錯誤的存在。

final 許可權 內部類 引用型別

final 不可改變。可以用於修飾類 方法和變數。final運用方面 1 修飾變數 基本型別的區域性變數,被final修飾後,只能賦值一次,不能再更改。2 區域性變數 引用型別 引用型別的區域性變數,被final修飾後,只能指向乙個物件,位址不能再更改。但是不影響物件內部的成員變數值的修改。3 成員...

final 許可權 內部類

代表最終不可變的。用法 1 用來修飾乙個類 不能有子類,所以其中所有的方法都不嗯呢該被覆蓋重寫。2 用來修飾乙個方法 方法不能被覆蓋重寫。3 用來修飾乙個區域性變數 variable 一次賦值,終生不變。4 用來修飾乙個成員變數 一次賦值,終生不變。沒有預設值需要手動賦值。final修飾的類又叫 太...

內部類訪問區域性變數為什麼要用final修飾

內部內訪問的區域性變數必須加final修飾符,因為方法入參裡面的區域性變數生命週期在方法體之內,而內部類的生命週期是成員級別的 如果不加final關鍵字 那麼當myrun方法執行完成之後name的生命週期就結束了 如果加上final關鍵字 記憶體中就會儲存乙份該內部變數的副本,當內部類訪問時其實訪問...