二十、final關鍵字
阿新 • • 發佈:2021-06-23
1、概述
學習了繼承後,我們知道,子類可以在父類的基礎上改寫父類內容,比如,方法重寫。那麼我們能不能隨意的繼承API中提供的類,改寫其內容呢?顯然這是不合適的。為了避免這種隨意改寫的情況,Java提供了final
關鍵字,
用於修飾不可改變內容。
2、final特點
final: 不可改變。可以用於修飾類、方法和變數。
-
類:被修飾的類,最終類,不能被繼承。
-
方法:被修飾的方法,最終方法,不能被重寫。
注意:被private修飾的方法子類也不能重寫
-
變數:被修飾的變數,變成自定義常量,不能被重新賦值。
-
自定義常量命名規範:每個字母都是大寫,每個單詞之間用下劃線分割
-
自定義常量,必須賦值;可以直接賦值,也可以在構造器或者程式碼塊中賦值
3、使用方式
修飾類
//格式:
final class 類名{
}
查詢API發現像 public final class String
、public final class Math
、public final class Scanner
等,很多我們學習過的類,都是被final修飾的,目的就是供我們使用,而不讓我們所以改變其內容。
修飾方法
//格式:
修飾符 final 返回值型別 方法名(引數列表){
方法體
}
重寫被 final
修飾的方法,編譯時就會報錯。
修飾變數
- 區域性變數——基本型別
基本型別的區域性變數,被final修飾後,只能賦值一次,不能再更改。程式碼如下:
public class FinalDemo1 {
public static void main(String[] args) {
// 宣告變數,使用final修飾
final int a;
// 第一次賦值
a = 10;
// 第二次賦值
a = 20; // 報錯,不可重新賦值
}
}
- 區域性變數——引用型別
引用型別的區域性變數,被 final 修飾後,只能指向一個物件,地址不能再更改。但是不影響物件內部的成員變數值的修改,程式碼如下:
public class FinalDemo2 { public static void main(String[] args) { // 建立 User 物件 final User u = new User(); // 建立 另一個 User物件 // u = new User(); // 報錯,指向了新的物件,地址值改變。 // 呼叫setName方法 u.setName("張三"); // 可以修改 } }
- 成員變數
成員變數涉及到初始化的問題,初始化方式有兩種,只能二選一:
-
顯示初始化;
public class User { final String USERNAME = "張三"; private int age; }
-
構造方法初始化。
public class User { final String USERNAME ; private int age; public User(String username, int age) { this.USERNAME = username; this.age = age; } }