java中static的做用詳解

java中static關鍵字表示靜態的意思,主要用於如下三點,static成員變量,static成員方法和static塊。在類中若是定義了static類型的對象(變量或者方法),在java虛擬機(JVM)加載類時,該對象就會被實例化,在使用的時候就不須要再去實例化,直接調用就能夠了。常與private,public搭配使用。下面詳細說一下這三部分。java

一、static變量this

按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另外一種是沒有被static修飾的變量,叫實例變量。spa

二者的區別是:code

對於靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態分配一次內存,在加載類的過程當中完成靜態變量的內存分配,可用類名直接訪問(方便),固然也能夠經過對象來訪問(可是這是不推薦的)。對象

對於實例變量,沒建立一個實例,就會爲實例變量分配一次內存,實例變量能夠在內存中有多個拷貝,互不影響(靈活)。內存

因此通常在須要實現如下兩個功能時使用靜態變量:虛擬機

  • 在對象之間共享值時
  • 方便訪問變量時

二、static方法class

靜態方法能夠直接經過類名調用,任何的實例也均可以調用,變量

所以靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。方法

由於實例成員與特定的對象關聯!這個須要去理解,想明白其中的道理,不是記憶!!!

由於static方法獨立於任何實例,所以static方法必須被實現,而不能是抽象的abstract。

例如爲了方便方法的調用,Java API中的Math類中全部的方法都是靜態的,而通常類內部的static方法也是方便其它類對該方法的調用。

靜態方法是類內部的一類特殊方法,只有在須要時纔將對應的方法聲明成靜態的,一個類內部的方法通常都是非靜態的

三、static代碼塊

static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,能夠有多個,位置能夠隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,若是static代碼塊有多個,JVM將按照它們在類中出現的前後順序依次執行它們,每一個代碼塊只會被執行一次。例如:

  1. public class Test5 {    
  2. private static int a;    
  3. private int b;    
  4.     
  5. static{    
  6. Test5.a=3;    
  7. System.out.println(a);    
  8. Test5 t=new Test5();    
  9. t.f();    
  10. t.b=1000;    
  11. System.out.println(t.b);    
  12. }    
  13. static{    
  14. Test5.a=4;    
  15. System.out.println(a);    
  16. }    
  17. public static void main(String[] args) {    
  18. // TODO 自動生成方法存根    
  19. }    
  20. static{    
  21. Test5.a=5;    
  22. System.out.println(a);    
  23. }    
  24. public void f(){    
  25. System.out.println("hhahhahah");    
  26. }    
  27. }    

運行結果:

3 
hhahhahah 
1000 
4 
5

利用靜態代碼塊能夠對一些static變量進行賦值,最後再看一眼這些例子,都一個static的main方法,這樣JVM在運行main方法的時候能夠直接調用而不用建立實例。

相關文章
相關標籤/搜索