1. 程式人生 > >Final、Static用法總結

Final、Static用法總結

首先介紹一下靜態變數和類變數
靜態變數也稱為類變數,屬於類,不屬於類的任何一個物件,在記憶體中有且僅有一個拷貝,多個物件共享記憶體空間。
例項變數,依存於某個例項,須先建立物件才能通過物件訪問。

靜態方法只能訪問靜態成員,因為非靜態方法的呼叫要先建立物件,在呼叫靜態方法時可能物件並沒有被初始化。

final

(1)修飾類:表示該類不能被繼承;
(2)修飾方法:表示方法不能被重寫;
(3)修飾變數:表示變數只能一次賦值以後值不能被修改(常量)。

對於final修飾變數再做一點解釋:
如果是基本資料型別的變數,則其數值一旦在初始化之後便不能更改;
如果是引用型別的變數,則在對其初始化之後便不能再讓其指向另一個物件,引用變數不能變,引用變數所指向的物件中的內容還是可以改變的。

static

static為靜態修飾符在程式中任何變數或者程式碼都是在編譯時由系統自動分配記憶體來儲存的。static修飾符表示靜態的,在類載入時Jvm會把它放到方法區,被本類以及本類的所有例項所共用。在編譯後所分配的記憶體會一直存在,直到程式退出記憶體才會釋放這個空間。如果一個被所有例項共用的方法被申明為static,那麼就可以節省空間,不用每個例項初始化的時候都被分配到記憶體。

靜態變數
Static關鍵字修飾成員變數被稱為靜態變數(也叫作類變數,同時 區域性變數也能被宣告為static),靜態變數在記憶體中只有一個拷貝(節省記憶體,方便物件之間共享值),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(當然也可以通過物件來訪問)。因為靜態變數被類的所有例項共用,所以非執行緒安全的。
未被Static修飾的成員變數叫作例項變數,每建立一個例項,就會為例項變數分配一次記憶體,例項變數在記憶體中可以有多個拷貝(但互相不影響,更加靈活)。
//靜態變數的申明

private static int count = 0;
public static String str;

靜態方法

靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫。只能訪問所屬類的靜態成員變數和成員方法,靜態方法中也不能用this和super關鍵字。類似於靜態變數,靜態方法也屬於類,不屬於例項的。
//靜態方法的申明

public static void s(int param) {
......    
}

靜態程式碼塊

靜態程式碼塊就是在類載入器載入物件時,要執行的一組語句。靜態塊只會在類載入到記憶體中的時候執行一次,位置可以隨便放,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。

static{
   //在類被載入的時候用於初始化資源,僅能訪問靜態變數和靜態方法
   System.out.println("StaticExample static block"
   }
  //執行順序:靜態程式碼塊(僅執行一次)、構造方法、空白程式碼塊 

靜態類

只能在內部類中定義靜態類,靜態內部類與外層類繫結,即使沒有建立外層類的物件,它一樣存在。靜態類的方法可以是靜態的方法也可以是非靜態的方法,靜態的方法可以在外層通過靜態類呼叫,而非靜態的方法必須要建立類的物件之後才能呼叫。只能引用外部類的static成員變數(也就是類變數)。
如果一個內部類不是被定義成靜態內部類,那麼在定義成員變數或者成員方法的時候,是不能夠被定義成靜態的。

public class OuterClass {  
   public static class InnerClass{  
       InnerClass(){  
           System.out.println("靜態內部類");  
       }  
   }  
}