Java final 類,final 方法,final變量


Java 中的final類與普通類幾乎沒有區別,只是失去了被繼承的權力。

1 什麼是final類
API中的某些類,如String,以及Math等,就是final類的典型例子。雖然在Java編程中並不經常使用final類和final方法,但它們有着與衆不同的特點,即final類不能被繼承,不能被覆蓋,以及final類在執行速度方面比一般類快。下面對final類和final方法的概念和編程技術分別加以討論,最後解釋爲什麼final類可以提高執行速度。
2 不能繼承final類
有時在程序需要對繼承加以限制。例如某些處理特殊運算和操作的類,爲了安全理由,不允許被其他類所繼承。final類沒有子類,即它處於繼承鏈的尾部,或者除了自動繼承Object之外,它們是獨立存在的支持類,例如執行密碼管理的類,處理數據庫信息的管理類等等。
使用final類的另外一個理由是執行速度。由於它的方法不能夠被覆蓋,所以其地址引用和裝載在編譯期間完成,而不是在運行期間由JVM進行復雜的裝載,因而簡單和有效。所以如果沒有必要,或者不存在有繼承的可能性時,儘量使用final類。當然,在API類庫中不多使用final類是因爲它們是標準程序,希望在實際軟件開發中得以廣泛使用。而具體的應用軟件開發則不同於標準庫程序開發。
注意final數據和final類的不同。final數據指常量,即其值一旦初始化,就不能改變。而final類則指不能被其他類所繼承的類。
3 定義final類
在類名前加以關鍵字final,這個類就被定義爲final類,如:

當一個類被定義爲final時,它的所有方法都自動成爲final方法,但不影響對變量的定義。
4 不能覆蓋final方法
也可以在超類中定義某個方法爲final方法。雖然這個類可以被繼承,但子類不能夠覆蓋final方法。API類中的許多方法,如print()和println(),以及Math類中的所有方法都定義爲final方法。在具體應用軟件開發中,一些執行特殊性運算和操作的方法,可以定義爲final方法。在方法的返回類型前加入關鍵字final,則定義該方法爲final,如:
5 final參數
final參數的含義如同final變量一樣,是常數參數,即當方法接受了這個參數後,其值不能改變。如下代碼中定義方法的參數爲final:
6 提高執行速度
final類可以提高執行速度主要因爲如下原因:
l 不涉及繼承和覆蓋。
l 其地址引用和裝載在編譯時完成。
l 在運行時不要求JVM執行因覆蓋而產生的動態地址引用而花費時間和空間。
l 與繼承鏈上的一般對象相比,垃圾回收器在收回final對象所佔據的地址空間時也相對簡單快捷。
但在某些情況下使用final方法並不能取得提高執行速度的結果。因爲並不是所有final方法其地址的裝載和引用在編譯時間完成。
假設類C繼承了B,B繼承了A,在類A中有final方法。對類C來講,調用A的final方法的確是inline編譯,即裝載在編譯時間完成;但對A和B來講,可能沒有調用final方法。而在執行期間,JVM動態裝載的方法有可能並不是C所調用的final方法。這種情況下,則不能夠取得提高執行速度的結果。當然,如果final方法在編譯時間裝載到JVM,而且沒有在執行期間覆蓋的,可以取得inline效益,提高執行速度。
作者建議是:不能僅僅因爲考慮追求提高執行速度而使用final類。在程序設計和代碼編寫時,應首先考慮這個類所執行的任務和安全因素,是否允許有子類。在這個前提下,儘量提高代碼的重複應用性是面向對象設計和編程的宗旨。然後考慮是否使用final類和final方法。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章