java使用final方法原因有兩個,
一、鎖定方法。防止任何繼承類修改、覆蓋
二、效率。在java早期實現中,如果將一個方法指明為final,就是同意編譯器將針對該方法的調用都轉化為內嵌調用。
意思就是:如果是內嵌調用,虛擬機不再執行正常的方法調用(參數壓棧,跳轉到方法處執行,再調回,處理棧參數,處理返回值),而是直接將方法展開,以方法體重的實際代碼替代原來的方法調用。這樣減少了方法調用的開銷(方法調用過程中CPU要進行現場處理(看做是一種中斷),當前的變量狀態、寄存器狀態、程序計數器PC等等,都要一一入棧保護起來,調用返回時又要一一出棧恢復以繼續執行。相對於順序執行流程,函數調用的入棧出棧帶來了額外的開銷,效率沒有順序執行高。)
最近的jvm技術中(特別是hotspot技術),虛擬機可以自己去根據具體情況自動優化選擇是否進行內聯,因此和final關鍵字就無關了。這時final關鍵字只是告訴編譯器,在編譯的時候考慮性能的提升,可以將final函數視為內聯函數。但最后編譯器會怎么處理,編譯器會分析將final函數處理為內聯和不處理為內聯的性能比較了。(和垃圾處理機制類似,程序員只有建議權而沒有決定權)