Android中static和final用法小結

Java關鍵字static、final使用小結java

static

 1. static變量
    按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另外一種是沒有被static修飾的變量,叫實例變量。二者的區別是: 
  對於靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態分配一次內存,在加載類的過程當中完成靜態變量的內存分配,可用類名直接訪問(方便),固然也能夠經過對象來訪問(可是這是不推薦的)。對於實例變量,沒建立一個實例,就會爲實例變量分配一次內存,實例變量能夠在內存中有多個拷貝,互不影響(靈活)。
 
2. static代碼塊
    static代碼塊是類加載時,初始化自動執行的。若是static代碼塊有多個,JVM將按照它們在類中出現的前後順序依次執行它們,每一個代碼塊只會被執行一次。
 
3. static方法
    static方法能夠直接經過類名調用,任何的實例也均可以調用,所以static方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。由於static方法獨立於任何實例,所以static方法必須被實現,而不能是抽象的abstract。
    static方法只能訪問static的變量和方法,由於非static的變量和方法是須要建立一個對象才能訪問的,而static的變量/方法不須要建立任何對象。
 
********
static的數據或方法,屬於整個類的而不是屬於某個對象的,是不會和類的任何對象實例聯繫到一塊兒。因此子類和父類之間能夠存在同名的static方法名,這裏不涉及重載。因此不能把任何方法體內的變量聲明爲static,例如:
fun() {
   static int i=0; //非法。
}
其實理解static是隻有一個存儲地方,而使用時直接使用,不須要建立對象,就能明白以上的注意事項。
 
另外,通常的類是沒有static的,只有內部類能夠加上static來表示嵌套類。
 

final

     在Java中聲明屬性、方法和類時,可以使用關鍵字final來修飾。
     final變量即爲常量,只能賦值一次;
     final方法不能被子類重寫;
     final類不能被繼承。
 
1. final變量
    聲明 final 字段有助於優化器做出更好的優化決定,由於若是編譯器知道字段的值不會更改,那麼它能安全地在寄存器中高速緩存該值。final 字段還經過讓編譯器強制該字段爲只讀來提供額外的安全級別。
     其初始化能夠在兩個地方,一是其定義處,也就是說在final變量定義時直接給其賦值,二是在構造函數中。這兩個地方只能選其一,要麼在定義時給值,要麼在構造函數中給值,不能同時既在定義時給了值,又在構造函數中給另外的值。
    一旦被初始化便不可改變,這裏不可改變的意思 對基本類型來講是其值不可變,而 對於對象變量來講其引用不可再變
    當函數參數爲final類型時,你能夠讀取使用該參數,可是沒法改變該參數的值。
    另外方法中的內部類在用到方法中的參變量時,此參變也必須聲明爲final纔可以使用。
     在java中,普通變量系統是自動初始化的,數值變量自動初始化爲0,其他類型變量自動初始化爲空。可是final類型的變量必須顯示初始化,且初始化的方法必須是在申明時或者在構造方法中直接賦值,而不能經過調用函數賦值。
 
2. final方法
    若是一個類不容許其子類覆蓋某個方法,則能夠把這個方法聲明爲final方法。
    使用final方法的緣由有二:
    第1、把方法鎖定,防止任何繼承類修改它的意義和實現。
    第2、高效。編譯器在遇到調用final方法時候會轉入內嵌inline機制,大大提升執行效率。
 
注意,類中全部的private方法都被隱含是final的。因爲沒法取用private方法,則也沒法重載之。
 
3. final類
    final類不能被繼承,所以final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,若是這個類不須要有子類,類的實現細節不容許改變,而且確信這個類不會載被擴展,那麼就設計爲final類。
 
-----------------
特別要注意一個問題:
    對於被static和final修飾過的實例常量,實例自己不能再改變了,但對於一些容器類型(好比,ArrayList、HashMap)的實例變量,不能夠改變容器變量自己,但能夠修改容器中存放的對象,這一點在編程中用到不少。
相關文章
相關標籤/搜索