舉例講解Java中final關(guān)鍵字的用法
1. final variable
final variable 就是一個常量,一旦被初始化就不可以被改變。
class Test1 { final double PI = 3.14; //常量的名稱最好大寫 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
在聲明時未初始化的 final variable 被稱作 blank final variable, blank final variable必須在 構(gòu)造函數(shù)中被初始化,否則會拋出編譯錯誤。
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 不能被覆蓋。也就是說子類可以調(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è)計成 final 的?
首先,先得清楚 final 這個關(guān)鍵字。
final的出現(xiàn)就是為了為了不想改變,而不想改變的理由有兩點:設(shè)計或者效率。final 修飾的類是不被能繼承的,所以 final 修飾的類是不能被篡改的。
了解了這一點,我們再看看問題:
(1)從設(shè)計上講,
A、確保它們不會在子類中改變語義。String類是final類,這意味著不允許任何人定義String的子類。換言之,如果有一個String的引用,它引用的一定是一個String對象,而不可能是其他類的對象。
B、String 一旦被創(chuàng)建是不能被修改的,因為 java 設(shè)計者將 String 為可以共享的,下面這段是源碼中的注釋:
(2)從效率上講:
A、設(shè)計成final,JVM才不用對相關(guān)方法在虛函數(shù)表中查詢,而直接定位到String類的相關(guān)方法上,提高了執(zhí)行效率。
B、Java設(shè)計者認為共享帶來的效率更高。
總而言之,就是要保證 java.lang.String 引用引用的對象一定是 java.lang.String的對象,而不是引用它的子孫類,這樣才能保證它的效率和安全。
相關(guān)文章
java?Comparable和Comparator的區(qū)別及作用面試精講
這篇文章主要為大家介紹了java?Comparable和Comparator的區(qū)別及作用面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10springboot整合mqtt實現(xiàn)消息訂閱和推送功能
mica-mqtt-client-spring-boot-starter是一個方便、高效、可靠的MQTT客戶端啟動器,適用于需要使用MQTT協(xié)議進行消息通信的Spring Boot應(yīng)用程序,這篇文章主要介紹了springboot整合mqtt實現(xiàn)消息訂閱和推送功能,需要的朋友可以參考下2024-02-02Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案
這篇文章主要介紹了Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07JAVA實現(xiàn)經(jīng)典游戲坦克大戰(zhàn)的示例代碼
小時候大家都玩過坦克大戰(zhàn)吧,熟悉的旋律和豐富的關(guān)卡陪伴了我們一整個寒暑假。本文將通過Java+Swing實現(xiàn)這一經(jīng)典游戲,感興趣的可以學(xué)習(xí)一下2022-01-01spring和quartz整合,并簡單調(diào)用(實例講解)
下面小編就為大家?guī)硪黄猻pring和quartz整合,并簡單調(diào)用(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例
這篇文章主要介紹了SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09