Java之關鍵字static和final的使用

來源:互聯網
上載者:User

標籤:

static

在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,例如:

1 fun() {2    static int i=0; //非法。3 }

其實理解static是只有一個儲存地方,而使用時直接使用,不需要建立對象,就能明白以上的注意事項。

另外,一般情況下類是沒有static的,只有內部類可以加上static來表示嵌套類。

 

final
在Java中聲明屬性、方法和類時,可使用關鍵字final來修飾。
final變數即為常量,只能賦值一次;
final方法不能被子類重寫;
final類不能被繼承。

1. final變數
      聲明 final 欄位有助於最佳化器作出更好的最佳化決定,因為如果編譯器知道欄位的值不會更改,那麼它能安全地在寄存器中快取該值。final 欄位還通過讓編譯器強制該欄位為唯讀來提供額外的安全層級。
其初始化可以在兩個地方,一是其定義處,也就是說在final變數定義時直接給其賦值,二是在建構函式中。這兩個地方只能選其一,要麼在定義時給值,要麼在建構函式中給值,不能同時既在定義時給了值,又在建構函式中給另外的值。
一旦被初始化便不可改變,這裡不可改變的意思對基本類型來說是其值不可變,而對於物件變數來說其引用不可再變。
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。
另外方法中的內部類在用到方法中的參變數時,此參變也必須聲明為final才可使用。
在java中,普通變數系統是自動初始化的,數值變數自動初始化為0,其餘類型變數自動初始化為null。但是final類型的變數必須顯示初始化,且初始化的方法必須是在申明時或者在構造方法中直接賦值,而不能通過調用函數賦值。

2. final方法
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
使用final方法的原因有二:
第一、把方法鎖定,防止任何繼承類修改它的意義和實現。
第二、高效。編譯器在遇到調用final方法時候會轉入內嵌inline機制,大大提高執行效率。

注意,類中所有的private方法都被隱含是final的。由於無法取用private方法,則也無法重載之。

3. final類
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,預設都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴充,那麼就設計為final類。

 

-----------------
特別要注意一個問題:
對於被static和final修飾過的執行個體常量,執行個體本身不能再改變了,但對於一些容器類型(比如,ArrayList、HashMap)的執行個體變數,不可以改變容器變數本身,但可以修改容器中存放的對象,這一點在編程中用到很多。

看個例子:

 1 import java.util.ArrayList; 2  3 public class TestStaticFinal { 4         private static final String strStaticFinalVar = "aaa"; 5         private static String strStaticVar = null; 6         private final String strFinalVar = null; 7         private static final int intStaticFinalVar = 0; 8         private static final Integer integerStaticFinalVar = new Integer(8); 9         private static final ArrayList<String> alStaticFinalVar = new ArrayList<String>();10 11         private void test() {12                 System.out.println("-------------值處理前----------");13                 System.out.println("strStaticFinalVar=" + strStaticFinalVar + "");14                 System.out.println("strStaticVar=" + strStaticVar + "");15                 System.out.println("strFinalVar=" + strFinalVar + "");16                 System.out.println("intStaticFinalVar=" + intStaticFinalVar + "");17                 System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "");18                 System.out.println("alStaticFinalVar=" + alStaticFinalVar + "");19 20 21                 //strStaticFinalVar="哈哈哈哈";//錯誤,final表示終態,不可以改變變數本身.22                 strStaticVar = "哈哈哈哈";         //正確,static表示類變數,值可以改變.23                 //strFinalVar="呵呵呵呵";            //錯誤, final表示終態,在定義的時候就要初值(哪怕給個null),一旦給定後就不可再更改。24                 //intStaticFinalVar=2;                 //錯誤, final表示終態,在定義的時候就要初值(哪怕給個null),一旦給定後就不可再更改。25                 //integerStaticFinalVar=new Integer(8);                //錯誤, final表示終態,在定義的時候就要初值(哪怕給個null),一旦給定後就不可再更改。26                 alStaticFinalVar.add("aaa");     //正確,容器變數本身沒有變化,但存放內容發生了變化。這個規則是非常常用的,有很多用途。27                 alStaticFinalVar.add("bbb");     //正確,容器變數本身沒有變化,但存放內容發生了變化。這個規則是非常常用的,有很多用途。28 29                 System.out.println("-------------值處理後----------");30                 System.out.println("strStaticFinalVar=" + strStaticFinalVar + "");31                 System.out.println("strStaticVar=" + strStaticVar + "");32                 System.out.println("strFinalVar=" + strFinalVar + "");33                 System.out.println("intStaticFinalVar=" + intStaticFinalVar + "");34                 System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "");35                 System.out.println("alStaticFinalVar=" + alStaticFinalVar + "");36         }37 38         public static void main(String args[]) {39                 new TestStaticFinal().test();40         }41 }

輸出結果

-------------值處理前----------strStaticFinalVar=aaastrStaticVar=nullstrFinalVar=nullintStaticFinalVar=0integerStaticFinalVar=8alStaticFinalVar=[]-------------值處理後----------strStaticFinalVar=aaastrStaticVar=哈哈哈哈strFinalVar=nullintStaticFinalVar=0integerStaticFinalVar=8alStaticFinalVar=[aaa, bbb] 轉自http://android.blog.51cto.com/268543/384614/

Java之關鍵字static和final的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.