static是一個靜態修飾符,用於修飾成員(成員變量,成員函數)。《thinking in java》對staic的使用場景有下面2種定義:「一種情形是隻想用一個存儲區域來保存一個特定的數據—— 不管要建立多少個對象,甚至根本不建立對象。另外一種情形是咱們須要一個特殊的方法,它沒有與這個類的任何對象關聯。也就是說,即便沒有建立對象,也須要一個能調用的方法」。。在類中,用static聲明的成員變量成爲靜態成員變量,用static聲明的方法即稱爲靜態方法。對於static,它有以下幾個特色:html
1.隨着類的加載而加載。java
一旦static被建立,它會一直存在靜態常量池中,知道程序執行完,隨着類的消失而消失,它的生命週期相對來講是最長的。函數
2.優先於對象存在this
靜態是優先於對象存在的。spa
舉個例子:code
public class Demo { public static void main(String[] args) { Test.name="hello"; Test.staticHello();//優於對象建立,因此能夠直接調用static修飾的方法 //Test.age=0 //調用非靜態變量age會報錯,由於對象還未建立 Test t=new Test();//建立對象 t.age=18;//這個時候就能夠調用非靜態變量和方法 t.normalHello(); } } class Test{ static String name; int age; public static void staticHello(){ System.out.println("static name:"+name); } public void normalHello(){ System.out.println("normal age:"+age); } }
輸出結果爲:orm
static name:hello
normal age:18htm
從這個例子還能夠看出,咱們能夠在沒有建立對象的狀況下,經過類名直接調用static修飾的方法和變量,因此能夠得知,static是不依賴於對象存在的,即對象
3.被類的全部對象所共享blog
所以,靜態的成員變量和方法也不能使用this,super關鍵字,這2個關鍵字都是基於對象的。
4.能夠直接被類名所調用
在上述的例子中,能夠看到static修飾的變量方法是直接經過類名Test調用出來的,固然,在建立對象以後,一樣可使用建立的對象去調用這個方法。
在不建立對象的狀況下,靜態方法不能訪問類的非靜態成員變量/方法,main方法就是一個靜態方法,假如咱們在Demo類裏建立一個成員變量String names,要在main方法裏直接取到這個值是不行的,若是沒有建立對象,它就不能直接訪問。而非靜態方法能夠訪問靜態成員/方法
《Thinking in java4》中「當程序建立第一個對類的靜態成員的引用時,就會加載這個類。這個證實構造器也是類的靜態方法,即便在構造器以前沒有使用static關鍵字」。由於靜態方法能夠在未建立對象時調用,從這個角度看,構造方法在對象未建立時調用,能夠看做是靜態方法。
但從另外一個方面來看,靜態方法不能調用實例方法,而構造方法能夠調用實例方法,因此構造方法也不算是靜態方法。