final含義
final是Java中的一個(gè)保留關(guān)鍵字,可以聲明成員變量、方法和類(lèi)。一旦你將引用聲明為final類(lèi)型,你將不能再改變這個(gè)引用了。編譯器會(huì)檢查代碼,如果你試圖將變量再次初始化的話,編譯器會(huì)報(bào)編譯錯(cuò)誤。
final變量
凡是對(duì)成員變量或者本地變量(在方法中的或者代碼塊中的變量稱(chēng)為本地變量)聲明為final的都叫做final變量。下面是final修飾變量的例子:
final int constValue = 1;// constValue = 2; The final local variable constValue cannot be assigned.
補(bǔ)充點(diǎn):
final方法
final也可以聲明方法。方法名前面加上final關(guān)鍵字,代表這個(gè)方法不可以被子類(lèi)重寫(xiě)。如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了,子類(lèi)中不需要改變?cè)摲椒?,你就可以將該方法聲明為final類(lèi)型。
final聲明的方法比非final的方法快,因?yàn)樵诰幾g的時(shí)候就已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定。下面是final方法的例子:
public class Person{ public final void printName() { System.out.println("wangzhengyi"); }}
final類(lèi)
使用final來(lái)修飾的類(lèi)叫做final類(lèi)。final類(lèi)通常功能是完整的,它們不能被繼承。Java中許多類(lèi)是final的,例如String類(lèi)。
不可變類(lèi)的一個(gè)好處就是它自身是線程安全的,你不需要考慮多線程環(huán)境下的線程安全問(wèn)題。要?jiǎng)?chuàng)建不可變類(lèi),需要實(shí)現(xiàn)如下幾個(gè)步驟:
注意:淺拷貝和深拷貝的區(qū)別:
淺拷貝(淺克隆):被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用仍然指向原來(lái)的對(duì)象。換言之,只復(fù)制對(duì)象的基本類(lèi)型,對(duì)象類(lèi)型仍屬于原來(lái)的引用。
深拷貝(深克隆):被復(fù)制的所有變量都含有與原來(lái)的對(duì)象相同的值,除去那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向被復(fù)制過(guò)的新對(duì)象,而不再是原有的那些被引用的對(duì)象。換言之,不僅復(fù)制對(duì)象的基本類(lèi)型,同時(shí)也復(fù)制原對(duì)象中的對(duì)象。
不可變類(lèi)示例:
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; } /** * 可變對(duì)象的訪問(wèn)方法:返回對(duì)象的拷貝 * @return */ public HashMap<Integer, String> gethMap() { return (HashMap<Integer, String>)hMap.clone(); } /** * 實(shí)現(xiàn)深拷貝的構(gòu)造器 */ 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; } /** * 實(shí)現(xiàn)淺拷貝構(gòu)造器 */ /* public FinalClassExample(int id, String name, HashMap<Integer, String> map) { this.id = id; this.name = name; this.hMap = map; } */}
final關(guān)鍵字好處
使用final關(guān)鍵字的優(yōu)勢(shì)如下:
新聞熱點(diǎn)
疑難解答
圖片精選