一.final關鍵字概述
1. 爲什麼會有final
由於繼承中有一個方法重寫的現象,而有時候我們不想讓子類去重寫父類的方法.這對這種情況java就給我們提供了一個關鍵字: final
2. final概述
final關鍵字是最終的意思,可以修飾類,變量,成員方法。
3. final修飾特點
- 修飾類: 被修飾類不能被繼承
- 修飾方法: 被修飾的方法不能被重寫
- 修飾變量: 被修飾的變量不能被重新賦值,因爲這個量其實是一個常量
4. final關鍵字修飾局部變量
- 基本類型,是值不能被改變
- 引用類型,是地址值不能被改變
二. final,finally,finalize有什麼不同?
1. final可以修飾類,方法,變量
- final修飾類代表類不可以繼承拓展
- final修飾變量表示變量不可以修改
- final修飾方法表示方法不可以被重寫
2. finally則是Java保證重點代碼一定要被執行的一種機制
可以使用 try-finally 或者 try-catch-finally 來進行類似關閉 JDBC連接、保證 unlock 鎖等動作。
3. finalize 是基礎類 java.lang.Object的一個方法
它的設計目的是保證對象在被垃圾收集前完成特定資源的回收。finalize 機制現在已經不推薦使用,並且在 JDK 9開始被標記爲 deprecated。
4. final 關鍵字深入理解
- 可以將方法或者類聲明爲 final,這樣就可以明確告知別人,這些行爲是不許修改的。
- 如果你關注過 Java 核心類庫的定義或源碼, 有沒有發現java.lang 包下面的很多類,相當一部分都被聲明成爲final class?在第三方類庫的一些基礎類中同樣如此,這可以有效避免 API 使用者更改基礎功能,某種程度上,這是保證平臺安全的必要手段。
- 使用 final 修飾參數或者變量,也可以清楚地避免意外賦值導致的編程錯誤,甚至,有人明確推薦將所有方法參數、本地變量、成員變量聲明成 final。
- final 變量產生了某種程度的不可變(immutable)的效果,所以,可以用於保護只讀數據,尤其是在併發編程中,因爲明確地不能再賦值 final 變量,有利於減少額外的同步開銷,也可以省去一些防禦性拷貝的必要。
5. 在以下4種特殊情況下,finally塊不會被執行:
- 在finally語句塊中發生了異常。
- 在前面的代碼中用了System.exit()退出程序。
- 程序所在的線程死亡。
- 關閉CPU。