深入Java Final
這篇文章,小編將為大家介紹Java Final,有需要的朋友可以參考一下
JAVA關鍵字final用於修飾資料、方法或類,通常意味著“無法改變的” ,既資料不能改變,方法不能覆蓋,類別不能繼承。一般採用final有兩種原因:設計和效率。而隨著JAVA版本的更新,一些效率上的問題可以交由編譯器和JVM處理。因此,採用final來解決效率問題就顯得不是那麼重要了。
Final修飾符大多運用於基本資料型別(primitive)域或不可變(immutable)類別的域(如果類別中的所有方法方法都不會改變其對象,這種類別就是不可變類別。 String就是一個不可變類別)。
【final資料】
Final關鍵字用修飾資料主要有兩種情況:
1. 編譯期常數
2. 運行時初始化的值
對於編譯期常數,指的是一個既是final又是static的域(依照慣例,編譯期常數全部用大寫字母命名,並且用下劃線分隔各個單字),它只佔據一段不能改變的儲存空間。編譯器可以將編譯期常數代入到任何可能用到它的運算式中,也就是說,可以在編譯時執行運算式,這相對減輕了執行時間負擔。編譯期常數在定義時必須對它賦值(不一定是基本型別)。
運行時初始化的值,對於基本類型,final使得其值不可改變;而對於物件引用,final使得引用不可改變,即無法將其改為指向另一個對象,然而,對象本身卻可以修改(適用於數組,數組也是物件)。
程式碼如下:
public class javaFinalData{ private static final String TESTD = "test"; public static final String TESTE = "test"; public static final String[] TESTF = {"1","2"}; //非基本类型 private static final String[] TESTG = new String[2]; public static void main(String args[]){ final int testA = 1; final String testB = "test"; final int[] testC = {1,1,2,}; System.out.println(testC[1]); testC[1] = 123; System.out.println(testC[1]); } }
【未賦值的final域】
JAVA允許產生未賦值的final域,但是必須在域的定義處或每個構造器中對final域進行賦值(有多少個構造器就必須賦值幾次),確保在使用前被初始化。採用這種方式,可以使得final運用得更靈活,在同一個類別中,根據不同的物件賦予不同的值,卻又保持不可改變的特性。
程式碼如下:
public class javaBlankFinal{ private final int blank; public javaBlankFinal(){ blank = 2011; } public javaBlankFinal(int temp){ blank = 2012; } public javaBlankFinal(String temp){ blank = 2014; } public static void main(String args[]){ new javaBlankFinal(); } }
【final方法】
使用final方法有兩方面原因:一是將方法鎖定,防止方法被覆蓋,確保在繼承中方法行為保持不變;二是將方法呼叫轉為內聯呼叫(inlining),以減少方法呼叫的開銷。但是,在最近的版本中,JVM可以自行進行最佳化,因此無需使用final方法來處理效率問題。
關於final方法,還有一點要注意,所有類別中的private方法都隱含地指定為final方法(也可以為其加上final修飾,但沒有意義)。當你試圖覆寫一個private方法,編譯器並沒有報錯,但是,實際上你並沒有覆寫該方法,只是產生了一個新方法。因為private方法是無法被外部類別所存取的,當然就無法覆蓋到它了。
使用@Override註解可以預防上述問題。如程式所示:
程式碼如下:
class finalFunction{ private void finalFunctionA(){ System.out.println("finalFunctionA"); } private final void finalFunctionB(){ System.out.println("finalFunctionB"); } final void finalFunctionC(){ System.out.println("finalFunctionC"); } void functionD(){} } class overrideFinalFunction extends finalFunction{ //@Override 添加@Override注解可以识别是否是override public void finalFunctionA(){ System.out.println("override finalFunctionA"); } public final void finalFunctionB(){ System.out.println("override finalFunctionB"); } //final void finalFunctionC(){} //Cannot override the final method from finalFunction @Override void functionD(){} //真正的override方法 } public class javaFinalFunction extends finalFunction{ public static void main(String args[]){ finalFunction ff = new finalFunction(); //ff.finalFunctionA(); //无法调用private方法 //ff.finalFunctionB(); overrideFinalFunction off = new overrideFinalFunction(); off.finalFunctionA(); //public方法 off.finalFunctionB(); } }
【final類別】
使用final類別一般是出於設計原因,不允許該類別被繼承。這樣可以確保類的行為不會改變,或許還能避免一些安全危機。 Final類別中所有的方法都隱式指定為final方法,因此無法被覆寫(因為final類別禁止繼承,也就無法覆寫其類別中的方法)。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類別指定final防止覆寫length()等方法。
對於final域來說,即使將一個類別宣告為final,類別中的域不會自動成為final域。
程式碼如下:
final class finalClass{ int testA = 2011; } //class extendFinalClassextends finalClass{} //can not extendthe final class finalClass public class javaFinalClass{ public static void main(String args[]){ finalClass fc = new finalClass(); System.out.println(fc.testA); fc.testA = 2012; System.out.println(fc.testA); } }
以上是深入Java Final的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。
