為什么使用private static final


 三個修飾符:private、static、final。

private:表示屬性或者方法是私有的與public、protected對應。public代表公用,其他類或者該類的子類也允許訪問被public修飾的屬性等;protected代表受保護的,其他類無法訪問被protected修飾的屬性或者其他東西但是允許該類的子類訪問;private代表私有的,不允許除本類之外的其他類訪問,包括子類也不允許訪問被private修飾的屬性或其他。

 static:靜態的,static修飾的東西(代碼塊、屬性等)不屬於任何對象屬於某個類,是對象公有的。static塊允許出現在任何地方,但是不允許出現在方法內部。

 final:最終的,也就是不允許修改,一旦賦值后被final修飾的東西就不再允許修改了。final修飾引用變量時,該引用不能改變其引用地址了,但是該引用的屬性還是允許修改的。final修飾方法時,被修飾的方法不能夠被重寫。final修飾的方法比非final方法要快,因為在編譯的時候就被靜態綁定了,不需要在運行時進行動態綁定。final修飾的類稱為final類。通常使用final修飾的類功能是完整的,因為不允許繼承(String、Integer等)。

final修飾變量時,該變量在類加載時就會被初始化,會因為對象的創建而創建加載。

static修飾變量時,該變量將只被初始化一次,此后不再重新初始化。

可見,final和static是不同的,一個類中若有着final和static修飾的兩個屬性,在創建對象時,static修飾的屬性只被初始化一次,而final修飾的屬性會隨着對象的創建而被創建初始化。

看下面代碼:

public class Atest {
    private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    private final String fs=sdf.format(new Date());
    private static String ss=sdf.format(new Date());
    public static void main(String[] args) {
        Atest aa=new Atest();
        try {
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Atest bb=new Atest();
        System.out.println("aa.fs="+aa.fs);
        System.out.println("aa.ss="+aa.ss);
        System.out.println("bb.fs="+bb.fs);
        System.out.println("bb.ss="+bb.ss);
    }
}

運行結果如下:

 

可見final修飾的屬性fs在線程sleep一秒后因為創建了新的對象所以值變了,而static修飾的變量因為是屬於類的所以沒有改變。

舉個栗子,比如log

通常我們使用Log打印日志時我們會這樣寫:

private static final Log log=LogFactory.getLog(Test.class);

這里我們將日志記錄器聲明為私有、靜態、final類型的了。有什么原因呢?首先日志記錄器應當是一個類內部的東西,不允許其子類或者其他類使用因此被private修飾為私有的。再其次,對於所有該類的對象也就是該類的所有實例只需要一個logger所以使用static修飾。且logger不能被替換或者修改、所以使用final再做修飾。 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM