舉例講解Java中final關(guān)鍵字的用法
1. final variable
final variable 就是一個(gè)常量,一旦被初始化就不可以被改變。
class Test1 {
final double PI = 3.14; //常量的名稱最好大寫(xiě)
public Test1(){
PI = 3.14;
}
void test(){
System.out.println("PI is: " + PI);
}
public static void main(String[] args){
Test1 t = new Test1();
t.test();
}
}
輸出:
PI is: 3.14
(1)Blank final variable
在聲明時(shí)未初始化的 final variable 被稱作 blank final variable, blank final variable必須在 構(gòu)造函數(shù)中被初始化,否則會(huì)拋出編譯錯(cuò)誤。
class Test1 {
final double PI;
Test1(){
PI = 3.14; //在構(gòu)造函數(shù)中初始化
}
void test(){
System.out.println("PI is: " + PI);
}
public static void main(String[] args){
Test1 t = new Test1();
t.test();
}
}
輸出:
PI is: 3.14
(2)Uninitialized static final variable
在聲明階段未初始化的 static final variable 只能在靜態(tài)代碼塊中被初始化
class Test1 {
static final double PI;
static {
PI = 3.14;
}
void test(){
System.out.println("PI is: " + PI);
}
public static void main(String[] args){
Test1 t = new Test1();
t.test();
}
}
輸出:
PI is: 3.14
2. final method
final method 不能被覆蓋。也就是說(shuō)子類可以調(diào)用父類的 fianl method,但是不能覆蓋它。
class Test {
static final double PI = 3.14;
final void test(){
System.out.println("PI is: " + PI);
}
}
class Test1 extends Test{
public static void main(String[] args){
Test1 t = new Test1();
t.test();
}
}
輸出:
PI is: 3.14
3. final class
final calss 不能被繼承
final class Test1 {
static final double PI = 3.14;
final void test(){
System.out.println("PI is: " + PI);
}
public static void main(String[] args){
Test1 t = new Test1();
t.test();
}
}
輸出:
PI is: 3.14
PS:java.lang.String類為什么設(shè)計(jì)成 final 的?
首先,先得清楚 final 這個(gè)關(guān)鍵字。
final的出現(xiàn)就是為了為了不想改變,而不想改變的理由有兩點(diǎn):設(shè)計(jì)或者效率。final 修飾的類是不被能繼承的,所以 final 修飾的類是不能被篡改的。
了解了這一點(diǎn),我們?cè)倏纯磫?wèn)題:
(1)從設(shè)計(jì)上講,
A、確保它們不會(huì)在子類中改變語(yǔ)義。String類是final類,這意味著不允許任何人定義String的子類。換言之,如果有一個(gè)String的引用,它引用的一定是一個(gè)String對(duì)象,而不可能是其他類的對(duì)象。
B、String 一旦被創(chuàng)建是不能被修改的,因?yàn)?java 設(shè)計(jì)者將 String 為可以共享的,下面這段是源碼中的注釋:
(2)從效率上講:
A、設(shè)計(jì)成final,JVM才不用對(duì)相關(guān)方法在虛函數(shù)表中查詢,而直接定位到String類的相關(guān)方法上,提高了執(zhí)行效率。
B、Java設(shè)計(jì)者認(rèn)為共享帶來(lái)的效率更高。
總而言之,就是要保證 java.lang.String 引用引用的對(duì)象一定是 java.lang.String的對(duì)象,而不是引用它的子孫類,這樣才能保證它的效率和安全。
相關(guān)文章
mybatis 集合嵌套查詢和集合嵌套結(jié)果的區(qū)別說(shuō)明
這篇文章主要介紹了mybatis 集合嵌套查詢和集合嵌套結(jié)果的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實(shí)現(xiàn)在線五子棋對(duì)戰(zhàn)游戲(人機(jī)對(duì)戰(zhàn))
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)在線五子棋對(duì)戰(zhàn)游戲(人機(jī)對(duì)戰(zhàn)),文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以嘗試一下2022-09-09
Java實(shí)現(xiàn)文件上傳的兩種方法(uploadify和Spring)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件上傳的兩種方法,uploadify和Spring實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
MyBatis自定義映射關(guān)系和關(guān)聯(lián)查詢實(shí)現(xiàn)方法詳解
這篇文章主要介紹了MyBatis自定義映射關(guān)系和關(guān)聯(lián)查詢實(shí)現(xiàn)方法,當(dāng)POJO屬性名與數(shù)據(jù)庫(kù)列名不一致時(shí),需要自定義實(shí)體類和結(jié)果集的映射關(guān)系,在MyBatis注解開(kāi)發(fā)中,使用@Results定義并使用自定義映射,使用 @ResultMap使用自定義映射2023-04-04
Java動(dòng)態(tài)批量生成logback日志文件的示例
本文主要介紹了Java動(dòng)態(tài)批量生成logback日志文件的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
數(shù)據(jù)庫(kù)連接池c3p0配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了數(shù)據(jù)庫(kù)連接池c3p0配置的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢報(bào)錯(cuò)的方法
這篇文章主要介紹了解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢報(bào)錯(cuò)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
java安全編碼指南之:表達(dá)式規(guī)則說(shuō)明
這篇文章主要介紹了java安全編碼指南之:表達(dá)式規(guī)則說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
idea springboot 修改css,jsp不重啟實(shí)現(xiàn)頁(yè)面更新的問(wèn)題
這篇文章主要介紹了idea springboot 修改css,jsp不重啟實(shí)現(xiàn)頁(yè)面更新的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

