final 關(guān)鍵字
final
關(guān)鍵字可以用來(lái)修飾變量、方法嘴瓤、類(lèi)。
final 變量
被聲明為final
的變量是只讀的廓脆,如果希望變量在程序運(yùn)行的過(guò)程中保持不變,可將其聲明為final
驾讲,可以與static
關(guān)鍵字結(jié)合來(lái)聲明一個(gè)常量,即
public static final String LOAN = "loan";
LOAN = new String("loan"); //invalid compilation error
如果final
修飾的是一個(gè)引用類(lèi)型厚柳,則意味著該變量的指向(或者說(shuō)該變量保存的地址是不變的)但其內(nèi)部狀態(tài)(即該地址下存儲(chǔ)的內(nèi)容)是可變的,例如:
final StringBuilder sb = new StringBuilder("Geeks");
sb.append("ForGeeks"); // 這是合法的别垮,對(duì)數(shù)組來(lái)說(shuō)也是如此
當(dāng)變量被final
修飾時(shí)扎谎,變量名應(yīng)全大寫(xiě),單詞間用下劃線(xiàn)分隔毁靶。
final
變量聲明后 必須 被初始化(但不要求聲明后立即初始化),且不能被再次賦值龙填。給final
變量初始化的三種方式:
在聲明時(shí)初始化
-
在構(gòu)造函數(shù)或 instance-initializer block 內(nèi)初始化拐叉,如:
static final double CAPACITY; // instance-initializer block; { CAPACITY = 25; }
-
在 static block 中初始化,如:
static final double EULERCONSTANT; // static block static { EULERCONSTANT = 2.3; }
final 方法
被final
修飾的方法不可被子類(lèi)重寫(xiě)宿礁,如果不希望子類(lèi)改變某個(gè)方法,則可將其聲明為final
梆靖。例如笔诵,Object類(lèi)的方法都被聲明為final
。
示例:
class PersonalLoan{
public final String getName(){
return "personal loan";
}
}
class CheapPersonalLoan extends PersonalLoan{
@Override
public final String getName(){
return "cheap personal loan"; //compilation error: overridden method is final
}
}
方法被聲明為final
后執(zhí)行效率更高(在方法較為簡(jiǎn)單的前提下)思喊,因?yàn)槠湓诰幾g時(shí)已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)動(dòng)態(tài)綁定恨课。
final 類(lèi)
被final
修飾的類(lèi)不能被繼承岳服,例如,String吊宋、和Integer、Float等不可變類(lèi)拖吼。
示例:
final class PersonalLoan{}
class CheapPersonalLoan extends PersonalLoan{ //compilation error: cannot inherit from final class
}
因此,抽象類(lèi)和接口不能用final
修飾吊档,因?yàn)槌橄箢?lèi)和接口必須被繼承。
final關(guān)鍵字的好處
- final關(guān)鍵字提高了性能鬼贱。JVM和Java應(yīng)用都會(huì)緩存final變量。
- final變量可以安全的在多線(xiàn)程環(huán)境下進(jìn)行共享这难,而不需要額外的同步開(kāi)銷(xiāo)葡秒。
- 使用final關(guān)鍵字,JVM會(huì)對(duì)方法眯牧、變量及類(lèi)進(jìn)行優(yōu)化。