Java中的关键字——final
引言
final 關鍵字和 c# 中的 sealed 關鍵字比較像,和 static 一樣,它可以用來修飾類、變量和方法;final顧名思義,最后的最終的,所以用它修飾的類、變量和方法不可以改變;
下面就從類、方法和變量三個方面分別介紹一下final關鍵字的作用和用法;
final類
final修飾的類無法被繼承
測試代碼:
// final修飾的類無法被繼承 final class Person {String name; } // Students類無法繼承由final修飾的Person,編譯不通過: // FinalTest01.java:6: 錯誤: 無法從最終Person進行繼承 class Students extends Person {String StuId; }用final修飾類就是為了不讓其他類繼承它,這樣就可以防止子類重寫父類方法或者隨意改動父類變量了;
final方法
final修飾的方法無法被覆蓋(重寫),但是可以重載;
測試代碼:
// final修飾的方法無法被覆蓋 class Person {final void walking() {System.out.println("I am walking");}// 重載void walking(String name) {System.out.println("I am walking");} } class Students extends Person {/*父類中final修飾了walking方法,所以子類重寫walking方法就無法覆蓋,編譯報錯:FinalTest02.java:17: 錯誤: Students中的walking()無法覆蓋Person中的walking()*/void walking() {System.out.println("Student is walking");}// 但是重載的還是可以編譯的void walking(String name) {System.out.println("Student is walking");} }final方法主要作用也就是防止子類重寫父類的某個方法;
final變量
final修飾的變量只能賦值一次
這里把final修飾變量的情況分為三種,依次是實例變量,靜態變量,引用變量
局部變量用法差不多一樣,這里就不提了;
final修飾實例變量
final修飾的實例變量,系統不會自動賦默認值,要求程序員必須手動賦值
可以在
中賦值;
測試代碼:
class Person {{idNum = "123456"; // 非靜態初始化塊中賦值}final String idNum;final String name = "張三"; // 聲明時賦值final int age;// final修飾的weight實例變量,系統不會默認賦值,所以編譯錯誤:// FinalTest03.java:15: 錯誤: 可能尚未初始化變量weight// final int weight;Person() {age = 18; // 構造器中賦值} } public class FinalTest03 {public static void main(String[] args) {Person p = new Person();System.out.println("idNum=" + p.idNum);System.out.println("name=" + p.name);System.out.println("age=" + p.age);} }輸出結果:
idNum=123456 name=張三 age=18final修飾靜態變量(類變量)
實例變量既然用 final 修飾,那么該實例變量值不會隨著對象變化而改變,既然這樣,沒有必要聲明為實例變量,最好聲明為靜態變量,這樣更節省內存(因為實例變量是在堆區一個對象一份,而類變量是在方法區一個類一份)
語法:static final 或者 final static ,這樣修飾變量又稱為 常量
可以在
中賦值
常量名建議全部字母大寫,單詞之間以下劃線連接
測試代碼:
class Person {static {ID_NUM = "123456"; // 靜態初始化塊中賦值}public final static String ID_NUM;public final static String NAME = "張三"; // 聲明靜態變量時賦值 } public class FinalTest04 {public static void main(String[] args) {Person p = new Person();System.out.println("ID_NUM=" + p.ID_NUM);System.out.println("NAME=" + p.NAME);} }輸出結果:
ID_NUM=123456 NAME=張三常量一般就是public權限了,因為誰都修改不了它
final修飾引用變量
final修飾引用變量,同樣也只能賦值一次,但是所賦的值是一個對象的地址,即該引用變量只能指向一個對象,并且永遠指向該對象;
但是該對象內的數據依然可以修改;
測試代碼:
class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;} } public class FinalTest05 {public static void main(String[] args) {// final修飾引用變量pfinal Person p = new Person("張三", 18);Person p2 = new Person("李四", 20);// p引用變量一旦賦值無法改變,編譯錯誤:// FinalTest05.java:17: 錯誤: 無法為最終變量p分配值// p = p2;// FinalTest05.java:19: 錯誤: 無法為最終變量p分配值// p = null;System.out.println("name=" + p.name);System.out.println("age=" + p.age);// 引用變量p指向的是一個對象,不能改變// 但是該對象可以任意改變p.name = p2.name;p.age = p2.age;System.out.println("name=" + p.name);System.out.println("age=" + p.age);} }輸出結果:
name=張三 age=18 name=李四 age=20總結
final關鍵字的使用主要就是這幾種情況,總結下來也就是這幾句話:
- final修飾的類無法被繼承
- final修飾的方法無法被覆蓋(重寫),但是可以重載;
- final修飾的變量只能賦值一次
而修飾變量時又有四種情況,但是不論如何核心還是只能賦值一次;
ps:如果內容有問題歡迎交流!
總結
以上是生活随笔為你收集整理的Java中的关键字——final的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中 instanceof 的用法
- 下一篇: [JAVA基础类库] Objec类