原文鏈接:www.baidu.com
final關鍵字的概述
學習了繼承後,我們知道,子類可以在父類的基礎上改寫父類內容,比如,方法重寫。那麼我們能不能隨意的繼承 API中提供的類,改寫其內容呢?顯然這是不合適的。爲了避免這種隨意改寫的情況,Java提供了 final 關鍵字, 用於修飾不可改變內容。
final關鍵字常見的四種用法
常見四種用法:
- 可以用來修飾一個類
- 可以用來修飾一個方法
- 還可以用來修飾一個局部變量
- 還可以用來修飾一個成員變量
修飾一個類
含義:當前這個類不能有任何的子類。一個類如果是final的,那麼其中所有的成員方法都無法進行覆蓋重寫。final類可以覆蓋重寫其父類中的方法。
格式:
final class 類名 {
//方法體
}
例如:
public final class MyClass /*extends Object*/ {
public void method() {
System.out.println("我是一個final類");
}
}
修飾一個方法
含義:當final關鍵字用來修飾一個方法的時候,這個方法就是最終方法,也就是不能被覆蓋重寫。
格式:
修飾符 final 返回值類型 方法名(參數列表){
//方法體
}
例如:
public class Fu {
public final void method(){
System.out.println("此方法是被final修飾,無法被覆蓋重寫");
}
}
注意事項:
- 對於類、方法來說,abstract關鍵字和final關鍵字不能同時使用,因爲矛盾。
修飾成員變量
基本類型的局部變量,被final修飾後,只能賦值一次,不能再更改。一次賦值,終生不變
例如:
public class FinalDemo1 {
public static void main(String[] args) {
// 聲明變量,使用final修飾
final int a;
// 第一次賦值
a = 10;
// 第二次賦值
a = 10; // 報錯,不可重新賦值
// 聲明變量,直接賦值,使用final修飾
final int b = 10;
// 第二次賦值
b = 20; // 報錯,不可重新賦值
}
}
引用類型的局部變量,被final修飾後,只能指向一個對象,地址不能再更改。但是不影響對象內部的成員變量值的修改
例如:
定義Person類
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
定義測試類
public class FinalDemo02 {
public static void main(String[] args) {
// 創建被final 修飾的對象
final Person person = new Person("張三");
//內存地址不可改變,妹new一次就是創建一個新的對象,內存地址不同
//person = new Person("李四");錯誤
//輸出對象的成員變量name的值
System.out.println(person.getName());
//改變對象的成員變量name的值
person.setName("李四");
//輸出對象的成員變量name的值
System.out.println(person.getName());
}
}
代碼執行後的結果
修飾成員變量
對於成員變量來說,如果使用final關鍵字修飾,那麼這個變量也照樣是不可變。
注意
- 由於成員變量具有默認值,所以用了final之後必須手動賦值,不會再給默認值了。
- 對於final的成員變量,要麼使用直接賦值,要麼通過構造方法賦值。二者選其一。
- 必須保證類當中所有重載的構造方法,都最終會對final的成員變量進行賦值。
例如
直接賦值
// 顯示初始化;直接賦值
public class User {
final String USERNAME = "張三";
private int age;
}
構造方法賦值
//構造方法初始化。構造方法進行賦值
public class Student {
//被final修飾的常量名稱,一般都有書寫規範,所有字母都大寫。
final String USERNAME;
private int age;
public Student(String username, int age) {
this.USERNAME = username;
this.age = age;
}
}