1.首先要明白一點,調(diào)用一個函數(shù)除了函數(shù)本身的執(zhí)行時間之外,還需要額外的時間去尋找這個函數(shù)(類內(nèi)部有一個函數(shù)簽名和函數(shù)地址的映射表)。所以減少函數(shù)調(diào)用次數(shù)就等于降低了性能消耗。
2.final修飾的函數(shù)會被編譯器優(yōu)化,優(yōu)化的結(jié)果是減少了函數(shù)調(diào)用的次數(shù)。編譯器是如何實現(xiàn)的呢?舉個例子給你看: public class Test { final void func(){System.out.println("g");}; public void main(String[] args) { for(int j=0;j<1000;j++) func(); } } 經(jīng)過編譯器優(yōu)化之后,這個類變成了相當于這樣寫: public class Test { final void func(){System.out.println("g");}; public void main(String[] args) { for(int j=0;j<1000;j++) {System.out.println("g");}; } 看出來區(qū)別了吧?編譯器直接將func的函數(shù)體內(nèi)嵌到了調(diào)用函數(shù)的地方,這樣的結(jié)果是節(jié)省了1000次函數(shù)調(diào)用,了解final函數(shù)的作用了吧。當然編譯器處理成字節(jié)碼,我那樣寫是為了讓你看明白。 不過,當函數(shù)體太長的話,用final可能適得其反,因為經(jīng)過編譯器內(nèi)嵌之后代碼長度大大增加,于是就增加了jvm解釋字節(jié)碼的時間。 另外,除了樓主你這句話所描述的作用之外,final函數(shù)還有另一個作用,就是將這個成員函數(shù)聲明為不可覆蓋,具體就像 尐瑞 所說。 final 方法
將方法聲明為final,那就說明你已經(jīng)知道這個方法提供的功能已經(jīng)滿足你要求,不需要進行擴展,并且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。另外有一種被稱為inline的機制,它會使你在調(diào)用final方法時,直接將方法主體插入到調(diào)用處,而不是進行例行的方法調(diào)用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高,然而當你的方法主體非常龐大時,或你在多處調(diào)用此方法,那么你的調(diào)用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進行方法定義。
final類 當你將final用于類身上時,你就需要仔細考慮,因為一個final類是無法被任何人繼承的,那也就意味著此類在一個繼承樹中是一個葉子類,并且此類的設計已被認為很完美而不需要進行修改或擴展。對于final類中的成員,你可以定義其為final,也可以不是final。而對于方法,由于所屬類為final的關系,自然也就成了final型的。你也可以明確的給final類中的方法加上一個final,但這顯然沒有意義。 final可以修飾類,函數(shù),變量
修飾類時:意思是修飾類為最終類,任何類不能再繼承它. 修改函數(shù)時:意思是該方法在類里是最終方法,繼承它的方法不能去重寫它. 修飾變量時:意思是被修飾的變量是常量或者叫終態(tài)變量,一旦初始化后就不能再改變變量的值. 1.final表明你的函數(shù)寫得很牛氣,不需要任何人重寫它.呵呵.
2.用final可以提高效率吧.究竟能提高多少,或者能提高,要看編譯器了. 3.順便說一句,String類的所有方法都是final的.因為String類是JAVA中采用最多的類,設計者不希望有人去繼承它,覆蓋它的方法,把這個類搞得亂七糟八的吧. |
|