static是一個靜態修飾符,用於修飾成員(成員變量,成員函數)。《thinking in java》對staic的使用場景有下面2種定義:“一種情形是只想用一個存儲區域來保存一個特定的數據—— 無論要創建多少個對象,甚至根本不創建對象。另一種情形是我們需要一個特殊的方法,它沒有與這個類的任何對象關聯。也就是說,即使沒有創建對象,也需要一個能調用的方法”。。在類中,用static聲明的成員變量成為靜態成員變量,用static聲明的方法即稱為靜態方法。對於static,它有如下幾個特點:
1.隨着類的加載而加載。
一旦static被創建,它會一直存在靜態常量池中,知道程序執行完,隨着類的消失而消失,它的生命周期相對來說是最長的。
2.優先於對象存在
靜態是優先於對象存在的。
舉個例子:
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); } }
輸出結果為:
static name:hello
normal age:18
從這個例子還可以看出,我們可以在沒有創建對象的情況下,通過類名直接調用static修飾的方法和變量,所以可以得知,static是不依賴於對象存在的,即
3.被類的所有對象所共享
因此,靜態的成員變量和方法也不能使用this,super關鍵字,這2個關鍵字都是基於對象的。
4.可以直接被類名所調用
在上述的例子中,可以看到static修飾的變量方法是直接通過類名Test調用出來的,當然,在創建對象之后,同樣可以使用創建的對象去調用這個方法。
在不創建對象的情況下,靜態方法不能訪問類的非靜態成員變量/方法,main方法就是一個靜態方法,假如我們在Demo類里創建一個成員變量String names,要在main方法里直接取到這個值是不行的,如果沒有創建對象,它就不能直接訪問。而非靜態方法可以訪問靜態成員/方法
《Thinking in java4》中“當程序創建第一個對類的靜態成員的引用時,就會加載這個類。這個證明構造器也是類的靜態方法,即使在構造器之前沒有使用static關鍵字”。因為靜態方法可以在未創建對象時調用,從這個角度看,構造方法在對象未創建時調用,可以看作是靜態方法。
但從另一個方面來看,靜態方法不能調用實例方法,而構造方法可以調用實例方法,所以構造方法也不算是靜態方法。