1. 程式人生 > >一直都知道final修飾的類不能被繼承,但是不知道為什麼不能被繼承!

一直都知道final修飾的類不能被繼承,但是不知道為什麼不能被繼承!

首先你要知道自己為什麼要用final,用final幹什麼!

final方法
之所以要使用final方法,可能是出於對兩方面理由的考慮。第一個是為方法“上鎖”,防止任何繼承類改變它的本來含義。設計程式時,若希望一個方法的行為在繼承期間保持
不變,而且不可被覆蓋或改寫,就可以採取這種做法。
這是final的規定

當你將final用於類身上時,一個final類是無法被任何人繼承的,那也就意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要
進行修改或擴充套件。對於final類中的成員,你可以定義其為final,也可以不是final。而對於方法,由於所屬類為final的關係,自然也就成了final型的。你也可以明確的給final
類中的方法加上一個final,但這顯然沒有意義。


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


final類
如果說整個類都是final(在它的定義前冠以final關鍵字),就表明自己不希望從這個類繼承,或者不允許其他任何人採取這種操作。換言之,出於這樣或那樣的原因,我們的類
肯定不需要進行任何改變;或者出於安全方面的理由,我們不希望進行子類化(子類處理)。