[toc]
final關(guān)鍵字 - think in java 筆記
之前對于final關(guān)鍵字只是大概了解,平時編碼幾乎用不到.最近,因為經(jīng)常要寫控件監(jiān)聽事件,在方法中局部匿名內(nèi)部類使用局部變量時,經(jīng)常遇到到底是添加final關(guān)鍵字還是將局部變量提升為全局變量的選擇迷茫.特此整理備忘.
問題原因
內(nèi)部類對象不能使用該內(nèi)部類所在方法的"非局部常量"局部變量存在"棧"中,方法結(jié)束后,棧結(jié)構(gòu)中的引用被刪除,但堆中內(nèi)部類的對象仍然存在,其引用有可能在其他代碼中使用,不能保證局部變量的存活期和方法內(nèi)部類對象一樣長,所以內(nèi)部類只能使用方法中的常量.
最常見的情況就是在Activity的生命周期方法中添加監(jiān)聽事件.
final 屬性
對于屬性,重要的是要保證其初始化.而對于初始化的不同途徑,final關(guān)鍵字的使用情況不同.
確保初始化
屬性必須賦予初始值.賦予初始值之后,基本數(shù)據(jù)類型的值不能被改變,而引用數(shù)據(jù)類型只是引用于堆內(nèi)存中對象的聯(lián)系不能改變,但堆內(nèi)存中的對象仍可改變.
編譯時常量
例如 : final int i = 3;
在運行時初始化
例如 : final int i = random.nextInt(20);
空白final
只有當確定通過構(gòu)造器一定能夠初始化該屬性時,final修飾的屬性才不必初始化.此時的屬性在保持final特性的同時,又能在實例化不同的對象時保持一定的靈活性.
static final
與只使用final修飾的屬性不同,static不會因不同的對象而不同.
final 參數(shù)
對于final 引用類型參數(shù),在方法中無法更改引用所指向的對象.對于final 基本類型參數(shù),在方法中參數(shù)為只讀模式,不能操作.
例如 : i + 1
與 i++
的區(qū)別,
在局部匿名內(nèi)部類中常見,與局部內(nèi)部類使用局部變量類似,常要求添加final修飾符.
例如 : ListView 適配 getView方法中,對控件添加監(jiān)聽事件并使用getView方法的參數(shù) int position
final 方法
主要目的是防止繼承類修改方法定義.
private 與 final
private 修飾的方法被隱式的指定為final,對private修飾過的方法添加final修飾符沒有意義.
對于父類中的private方法,無法重寫,即使你嘗試這么做了,也只是生成了一個新的方法而已.
final 類
防止有子類繼承該類;因此,該類中的所有方法同時被隱式的指定為final.但屬性可根據(jù)需要選擇修飾符.
final類與java類庫
對方法使用final修飾符的必要性?而對于類的復(fù)用方式很難預(yù)測,final方法很多時候顯得過于嚴苛.