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將按照它們在類中出現的前後順序依次執行它們,每一個代碼塊只會被執行一次。例如:
- public class Test5 {
- private static int a;
- private int b;
- static{
- Test5.a=3;
- System.out.println(a);
- Test5 t=new Test5();
- t.f();
- t.b=1000;
- System.out.println(t.b);
- }
- static{
- Test5.a=4;
- System.out.println(a);
- }
- public static void main(String[] args) {
- // TODO 自動生成方法存根
- }
- static{
- Test5.a=5;
- System.out.println(a);
- }
- public void f(){
- System.out.println("hhahhahah");
- }
- }
運行結果:
3 hhahhahah 1000 4 5
利用靜態代碼塊能夠對一些static變量進行賦值,最後再看一眼這些例子,都一個static的main方法,這樣JVM在運行main方法的時候能夠直接調用而不用建立實例。