1.概述
Final關鍵字,顧名思義,就是不可更改的,這一定正確嗎?final可以修飾變量,方法,類,那使用過程中有哪些特點呢?
2.爲什麼使用Final關鍵字
- 提高效率
- 避免更改
3.如何使用Final關鍵字
final可以修飾變量,方法,類
1.Final變量
final修飾變量,我們希望它達到如下目的。final編譯期決定的值,永遠不會變。final運行期初始化決定的值,我們不希望它改變。
final修飾基本數據類型:必須提供初始值,編譯器將其封裝到需要計算的過程裏面,計算可在編譯期提前執行,進而提高效率。
final修飾的對象:不必提供初始值,但是在構造函數裏面對其進行初始化。但可以對對象的內容進行修改,也就是說final的只是對象的引用句柄,引用指向的內容還是可以修改的。
static final和final的區別:這兩者的區別是很細微的,只有在運行期初始化final才能夠看出來。
例子:
public class FinalData {
final int i4 = (int)(Math.random()*10);
static final int i5 = (int)(Math.random()*10);
public void print(String id) {
System.out.println(id + ": " + "i4 = " + i4 + ", i5 = " + i5);
}
public static void main(String[] args) {
FinalData fd1 = new FinalData();
fd1.print("fd1");
FinalData fd2 = new FinalData();
fd2.print("fd2");
}
}
運行結果:
fd1: i4 = 8, i5 = 6
fd2: i4 = 8, i5 = 6
對於變量i5,因爲它是static的,因此它在載入時初始化,屬於某個類,而非每創建一個對象時初始化。因此i5保持不變,i4會改變。
2. Final方法
使用final方法兩大目的:
避免複寫方法:
給方法上鎖,避免方法被子類改變,複寫,不想改變方法的語義,即該方法不可覆蓋。提高效率:
final方法默認會被編譯器編入具體的調用代碼塊中去,而不是普通方法(自變量壓棧,跳至相應代碼塊,跳回來,清除壓棧的自變量,處理返回值)。這樣可以避免方法調用時候的開銷。但如果該方法體體積很大,效率也沒怎麼提高。private方法自動被編譯器處理爲final,因爲無法訪問一個private方法,那就final吧!
另外,java編譯器不爲final方法實現動態綁定,進而進一步爲final方法調用生成更高效率代碼。
3. Final類
希望該類不被繼承,不被修改,涉及該類的對象操作儘可能快。
總結
匿名內部類的方法參數必須是final的
final的值可以在運行期決定
final修飾基本類型不能修改,final修飾對象,對象句柄不可改,對象內容可以改。(類似數組?)