詳解Java中的final關鍵字的使用
final含義
final是Java中的一個保留關鍵字,可以聲明成員變量、方法和類。一旦你將引用聲明為final類型,你將不能再改變這個引用了。編譯器會檢查代碼,如果你試圖將變量再次初始化的話,編譯器會報編譯錯誤。
final變量
凡是對成員變量或者本地變量(在方法中的或者代碼塊中的變量稱為本地變量)聲明為final的都叫做final變量。下面是final修飾變量的例子:
final int constValue = 1; // constValue = 2; The final local variable constValue cannot be assigned.
補充點:
- final成員變量必須在聲明的時候初始化或者在構造函數(shù)中初始化,否則編譯器會報錯。
- 不能夠對final變量再次賦值。
- 在匿名類中所有變量都必須是final變量。
final方法
final也可以聲明方法。方法名前面加上final關鍵字,代表這個方法不可以被子類重寫。如果你認為一個方法的功能已經(jīng)足夠完整了,子類中不需要改變該方法,你就可以將該方法聲明為final類型。
final聲明的方法比非final的方法快,因為在編譯的時候就已經(jīng)靜態(tài)綁定了,不需要在運行時再動態(tài)綁定。下面是final方法的例子:
public class Person
{
public final void printName() {
System.out.println("wangzhengyi");
}
}
final類
使用final來修飾的類叫做final類。final類通常功能是完整的,它們不能被繼承。Java中許多類是final的,例如String類。
不可變類的一個好處就是它自身是線程安全的,你不需要考慮多線程環(huán)境下的線程安全問題。要創(chuàng)建不可變類,需要實現(xiàn)如下幾個步驟:
- 將類聲明為final,使它不能被繼承。
- 將所有的成員聲明為私有的,這樣就不允許直接訪問這些成員。
- 對變量不要提供setter方法。
- 將所有可變的成員聲明為final,這樣只能對它們賦值一次。
- 通過構造器初始化所有成員,進行深拷貝(deep copy)。
- 在getter方法中,不要直接返回對象本身,而是克隆對象,并返回對象的拷貝。
注意:淺拷貝和深拷貝的區(qū)別:
淺拷貝(淺克?。罕粡椭茖ο蟮乃凶兞慷己信c原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,只復制對象的基本類型,對象類型仍屬于原來的引用。
深拷貝(深克隆):被復制的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,不僅復制對象的基本類型,同時也復制原對象中的對象。
不可變類示例:
import java.util.HashMap;
import java.util.Iterator;
public class FinalClassExample {
private final int id;
private final String name;
private final HashMap<Integer, String> hMap;
public int getId() {
return id;
}
public String getName() {
return name;
}
/**
* 可變對象的訪問方法:返回對象的拷貝
* @return
*/
public HashMap<Integer, String> gethMap() {
return (HashMap<Integer, String>)hMap.clone();
}
/**
* 實現(xiàn)深拷貝的構造器
*/
public FinalClassExample(int id, String name, HashMap<Integer, String> map) {
this.id = id;
this.name = name;
HashMap<Integer, String> tMap = new HashMap<Integer, String>();
int key;
Iterator<Integer> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
key = iterator.next();
tMap.put(key, map.get(key));
}
this.hMap = tMap;
}
/**
* 實現(xiàn)淺拷貝構造器
*/
/*
public FinalClassExample(int id, String name, HashMap<Integer, String> map) {
this.id = id;
this.name = name;
this.hMap = map;
}
*/
}
final關鍵字好處
使用final關鍵字的優(yōu)勢如下:
- final關鍵字提高了性能。JVM和Java應用都會緩存final變量。
- final變量可以安全的在多線程環(huán)境下進行共享,而不需要額外的同步開銷。
- 使用final關鍵字,JVM會對方法、變量以及類進行優(yōu)化。
相關文章
java使用HttpSession實現(xiàn)QQ訪問記錄
這篇文章主要介紹了java使用HttpSession實現(xiàn)QQ的訪問記錄的相關資料,需要的朋友可以參考下2016-03-03
CompletableFuture并行處理List分批數(shù)據(jù)demo
這篇文章主要介紹了CompletableFuture并行處理List分批數(shù)據(jù)實現(xiàn)實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
Java在PowerPoint中添加上標和下標的實現(xiàn)方法
當我們在演示文稿中添加商標、版權或其他符號時,我們可能希望該符號出現(xiàn)在某個文本的上方或下方。在Microsoft PowerPoint中,我們可以通過對符號應用上標或下標格式來實現(xiàn)這種效果,這篇文章主要介紹了Java在PowerPoint中添加上標和下標,需要的朋友可以參考下2022-10-10

