詳解Java中final的用法
概念
final 具有“不可改變的”的含義,可以修飾 非抽象類、非抽象成員方法和變量。
- 用 final 修飾的類不能被繼承,沒有子類。
- 用 final 修飾的方法不能被子類的方法覆蓋(重寫)。
- 用 final 修飾的變量表示常量,只能被賦一次值(聲明變量的時候)。
注:
final 不能用來修飾構(gòu)造方法,因為“方法覆蓋”這一概念僅適用于類的成員方法,而不適用于類的構(gòu)造方法,父類的構(gòu)造方法和子類的構(gòu)造方法之間不存在覆蓋的關(guān)系,因此用final修飾構(gòu)造方法沒有任何意義。
父類中用 private 修飾的方法不能被子類的方法所覆蓋,因此可以理解為 private 類型的方法默認(rèn)是 final 類型的。
final 類
把類定義為 final,使這個類不能被繼承。具體使用場景如下:
- 不是專門為繼承而設(shè)計的類,類本身的方法之間有復(fù)雜的調(diào)用關(guān)系。如果隨意創(chuàng)建這些類的子類,子類有可能會錯誤的修改了父類的實現(xiàn)細(xì)節(jié)。
- 處于安全的原因,類的實現(xiàn)細(xì)節(jié)不允許在被擴(kuò)展。
- 在創(chuàng)建對象模型時,確信這個類不會再被擴(kuò)展。
例如:JDK中的java.lang.String 類被定義為 final 類型。
public final class String{...}
final 方法
在某些情況下,出于安全原因,父類不允許子類覆蓋某個方法,此時可以把這個方法聲明為 final 類型。
例如:JDK中的java.lang.Object 類中,getClass()方法為 final 類型,而 equals() 方法不為 final 類型。
所有 Object 的子類都可以覆蓋 equals() 方法,但不能覆蓋 getClass() 方法。
final 變量
用 final 修飾的變量表示取值不會改變的常量。
例如:JDK中 java.lang.Integer 類中定義了兩個常量。
public static final int MIN_VALUE = 0x80000000;
public static final int MAX_VALUE = 0x7fffffff;
final 變量具有以下特征:
- final修飾符可以修飾靜態(tài)變量、成員變量和局部變量,分別表示靜態(tài)常量、實例常量和局部常量。
public class Demo{
public static final int MAX_VALUE = 23; //靜態(tài)常量
public static final int MIN_VALUE = 10; //靜態(tài)常量
private final Date birthday = new Date(); //成員常量
}
靜態(tài)常量一般以大寫字母命名,單詞之間以“_”符號分開。
- final修飾的成員變量必須初始化。
public class FinalTest {
final int a = 1; //成員常量 默認(rèn)初始化
static final int b = 2; //靜態(tài)常量 默認(rèn)初始化
final int c; //成員常量
static final int d; //靜態(tài)常量
public FinalTest(){
c = 3; //成員常量 未默認(rèn)初始化,可在構(gòu)造函數(shù)中初始化
}
static {
d = 4; //靜態(tài)常量 未默認(rèn)初始化,可在靜態(tài)代碼塊中初始化
}
}
final 變量只能賦一次值,如果將引用類型的變量用 final 修飾,該變量只能始終引用一個對象,但可以改變對象的內(nèi)容。
public class FinalTest {
String str = "";
public void print(){
System.out.println(str);
}
public static void main(String[] args){
final FinalTest finalTest = new FinalTest();
finalTest.str = "xixihaha";
finalTest.print();
}
}
總結(jié):
實際程序中,通過 final 修飾符來定義常量,目的為:
- 提高程序的安全性。
- 提高代碼可維護(hù)性。
- 提供代碼可讀性。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
Mybatis之typeAlias配置的3種方式小結(jié)
這篇文章主要介紹了Mybatis之typeAlias配置的3種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
springboot整合mybatis分頁攔截器的問題小結(jié)
springboot整合mybatis分頁攔截器,分頁攔截實際上就是獲取sql后將sql拼接limit,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07
Java中ConcurrentHashMap是如何實現(xiàn)線程安全
ConcurrentHashMap是一個哈希表,支持檢索的全并發(fā)和更新的高預(yù)期并發(fā)。本文主要介紹了Java中ConcurrentHashMap是如何實現(xiàn)線程安全,感興趣的可以了解一下2021-11-11
springboot?整合表達(dá)式計算引擎?Aviator?使用示例詳解
本文詳細(xì)介紹了Google?Aviator?這款高性能、輕量級的?Java?表達(dá)式求值引擎,并通過詳細(xì)的代碼操作演示了相關(guān)API的使用以及如何在springboot項目中進(jìn)行集成,感興趣的朋友一起看看吧2024-08-08

