之所以要使用final方法,可能是出於對兩方面理由的考慮。第一個是為方法“上鎖”,防止任何繼承類改變它的本來含義。設計程式時,若希望一個方法的行為在繼承期間保持不變,而且不可被覆蓋或改寫,就可以採取這種做法。
採用final方法的第二個理由是程式執行的效率。將一個方法設成final後,編譯器就可以把對那個方法的所有呼叫都置入“嵌入”呼叫裡。只要編譯器發現一個final方法呼叫,就會(根據它自己的判斷)忽略為執行方法呼叫機制而採取的常規程式碼插入方法(將自變數壓入堆疊;跳至方法程式碼並執行它;跳回來;清除堆疊自變數;最後對返回值進行處理)。相反,它會用方法主體內實際程式碼的一個副本來替換方法呼叫。這樣做可避免方法呼叫時的系統開銷。當然,若方法體積太大,那麼程式也會變得雍腫,可能受到到不到嵌入程式碼所帶來的任何效能提升。因為任何提升都被花在方法內部的時間抵消了。Java編譯器能自動偵測這些情況,並頗為“明智”地決定是否嵌入一個final方法。然而,最好還是不要完全相信編譯器能正確地作出所有判斷。通常,只有在方法的程式碼量非常少,或者想明確禁止方法被覆蓋的時候,才應考慮將一個方法設為final。類內所有private方法都自動成為final。由於我們不能訪問一個private方法,所以它絕對不會被其他方法覆蓋(若強行這樣做,編譯器會給出錯誤提示)。可為一個private方法新增final指示符,但卻不能為那個方法提供任何額外的含義。