三個修飾符: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再做修飾。
