Java 關鍵字:final
一、final 關鍵字
1、概述
子類繼承父類後,可以改寫父類內容,如方法重寫。但是我們卻不能隨意的去繼承 API 中提供的類,然後改寫其內容。
這是因為 Java 提供了final關鍵字,用於修飾不可改變內容。
2、作用範圍
在Java中宣告類、 變數和方法時, 可使用關鍵字final來修飾,表示“最終的” 。
(1)final 標記的類不能被繼承。
被 final 修飾的類,不能被繼承。提高安全性, 提高程式的可讀性。
可以用來修飾 外部類 和 內部類。
(2)final 標記的方法不能被子類重寫。
final 可以用來修飾靜態方法 和 非靜態方法,不能被重寫,可以被繼承。
(3)final 標記的變數(成員變數或區域性變數)即稱為常量。
final 可以用來修飾變數(成員變數(類變數、例項變數)、區域性變數)
二、修飾類
1、使用方式
定義格式:
final class 類名 {
// 方法體
}
像 Java 中的 String,Math,System,Scanner 這些類都是宣告為 final 類,目的就是供使用,而不讓隨意改變其內容。
2、注意點
final 修飾的類一定不能被繼承。
三、修飾方法
1、使用方式
定義格式:
其他修飾符 final 返回值型別 方法名(引數列表){ //方法體 }
2、注意點
(1)如果重寫 final 修飾的方法,編譯會報錯;
(2)對於類、方法來說,abstract關鍵字和final關鍵字不能同時使用,因為矛盾。
四、修飾變數
1、修飾成員變數
final修飾屬性:可以考慮賦值的位置有:顯式初始化、程式碼塊中初始化、構造器中初始化。
① 顯示初始化
1 public class User {
2 final String USERNAME = "張三";
3 private int age;
4 }
② 程式碼塊中初始化
1 public class User {
2 final String USERNAME;
3 {
4 USERNAME = "張三";
5 }
6 private int age;
7 }
③ 構造器中初始化
1 public class User {
2 final String USERNAME ;
3 private int age;
4 public User(String username, int age) {
5 this.USERNAME = username;
6 this.age = age;
7 }
8 }
注意:
(1)對於final的成員變數,要麼使用直接賦值,要麼通過程式碼塊或者構造方法賦值。三者選其一。
(2)必須保證類當中所有過載的構造方法,都最終會對 final 的成員變數進行賦值。
(3)static final 用來修飾屬性:全域性常量
2、修飾區域性變數
(1)修飾區域性變數——基本資料型別
基本型別的區域性變數,被 final 修飾後,只能賦值一次,不能再更改。
Demo:
1 public class FinalDemo1 {
2 public static void main(String[] args) {
3 // 宣告變數,使用final修飾
4 final int a;
5 // 第一次賦值
6 a = 10;
7 // 第二次賦值
8 a = 20; // 報錯,不可重新賦值
9 // 宣告變數,直接賦值,使用final修飾
10 final int b = 10;
11 // 第二次賦值
12 b = 20; // 報錯,不可重新賦值
13 }
14 }
(2)修飾區域性變數——引用型別
引用型別的區域性變數,被 final 修飾後,只能指向一個物件,地址不能再更改。但是不影響物件內部的成員變數值的修改。
Demo:
1 public class FinalDemo2 {
2 public static void main(String[] args) {
3 // 建立 User 物件
4 final User u = new User();
5 // 建立 另一個 User物件
6 u = new User(); // 報錯,指向了新的物件,地址值改變。
7 // 呼叫setName方法
8 u.setName("張三"); // 可以修改
9 }
10 }
注意:尤其是使用final修飾形參時,表明此形參是一個常量。當我們呼叫此方法時,給常量形參賦一個實參。一旦賦值以後,就只能在方法體內使用此形參,但不能進行重新賦值。
Demo:
1 public class Something {
2 public static void main(String[] args) {
3 Other o = new Other();
4 new Something().addOne(o);
5 }
6 public void addOne(final Other o) {
7 // o = new Other(); 錯誤的 形參只能指向原來的物件,不能指向新的物件
8 o.i++;
9 }
10 }
11 class Other {
12 public int i;
13 }
3、注意
(1)被 final 修飾的常量名稱,一般都有書寫規範,所有字母都大寫。
(2)final 用來修飾變數:此時的"變數"就稱為是一個常量。