static final 和final的區別 2016.12.07

學習java的時候經常會被修飾符搞糊塗,這裏總結下static final和final的區別。java

一、static 強調只有一份,final 說明是一個常量,final定義的基本類型的值是不可改變的,可是fianl定義的引用對象的值是能夠改變的,下面舉個例子來講明:程序員

package DifStaticFinalAndFinal; class SelfCounter { private static int counter; private int id=counter++; public String toString(){ return "SelfCounter: "+id; } }
package DifStaticFinalAndFinal; class WithFinalFields { static final SelfCounter wffs=new SelfCounter(); final SelfCounter wff=new SelfCounter(); public String toString(){ return "wff= "+wff+",\n wffs= "+wffs; } }

主函數:函數

package DifStaticFinalAndFinal; public class StaticFinal { public static void main(String[] args) { System.out.println("First Object:"); System.out.println(new WithFinalFields()); System.out.println("Second Object:"); System.out.println(new WithFinalFields()); } }

運行結果:性能

First Object: wff= SelfCounter: 1, wffs= SelfCounter: 0 Second Object: wff= SelfCounter: 2, wffs= SelfCounter: 0

分析爲何wff兩次的運行結果不一樣,而wffs兩次的運行結果相同?學習

由於wffs這個容器是用static final來定義的,static 強調只有一份,所以只有一個值,spa

而final修飾的引用是能夠變化的,所以wff的值是能夠變化的,這也是final修飾基本類型和引用的不一樣。code

二、在方法中將參數指明爲final時,在使用該方法時,能夠讀參數可是沒法使用該參數。對象

package cn.qdu.chapter7_example; public class FinalArguments { void with(final Gizmo g){ } void without(Gizmo g){ g=new Gizmo(); g.spin(); } int g(final int i){return i+1;} public static void main(String[] args) { FinalArguments bf=new FinalArguments();  bf.with(null);//無論這裏的參數換成什麼,都是執行void(final Gizmo g)方法,沒法更改參數 bf.without(null); } }

三、爲何使用final方法呢?blog

緣由有兩個。其一是把方法鎖定,確保在繼承中使用方法行爲不變,而且不會被覆蓋;繼承

其二是效率,若是一個方法指明爲final,就是贊成編譯器將針對該方法的全部調用都轉爲內嵌調用。 轉爲內嵌調用的目的是節省開銷,由於編譯器發現一個final方法調用命令時,會跳過程序代碼這種正常方式而執行方法調用機制(將參數壓入棧,跳至方法代碼處並執行,而後跳回並清理棧中的參數,處理返回值),而且以方法體中的實際代碼的副原本替代方法調用。可是若是一個方法很大,程序很膨脹,就會看不到內嵌帶來的任何性能的提升。

四、final和private關鍵字

類中全部private方法都隱式地指定爲是final的,由於private關鍵字只能被本類調用,其餘類中的方法也沒法覆蓋private修飾的方法,所以和加上final效果是同樣的。

五、當某個類的總體定義爲final時,代表該類不能被繼承,方法不能被覆蓋,且final類中的全部方法都隱式指定爲是final的,方法聲明爲final後還能夠有效地「關閉」動態綁定。

六、static加載類的動做只發生一次。

    最後,說了這麼多,也要對final作一個客觀的評價。若方法或類不想讓別人來繼承和修改,設定爲final是明智的,可是在團體中這樣會阻礙其餘程序員經過你想不到的合理的途徑來複用類,這樣的話final方法就顯得過於嚴苛了。

相關文章
相關標籤/搜索