在Java類中,我們常常會看到static關鍵字,往往被稱為靜態的。Static修 飾符可以用來修飾數據成員,方法成員,但是不能修飾類(此處指外部類),不 能修飾構造方法。如:
package com.csst.vo;
public class User {
private String name;
private static int count;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static int getCount() {
return count;
}
public static void main(String[] args){
User user1=new User();
User user2=new User();
user1.setName("Rose");
user2.setName("Kate");
user1.count=10;
user2.count=20;
System.out.println ("user1.name:"+user1.getName()+" user2.name:"+user2.getName());
System.out.println ("user1.count:"+User.getCount() +"user2.count:"+user2.count);
}
}
該程序運行結果為:
user1.name:Rose user2.name:Kate
user1.count:20 user2.count:20
我們可以發現,user1和user2的name屬性是不同的,分別為該對象調用 setName所指定的,而雖然user1和user2分別對count屬性指定了不同的值,但是 最終輸出的count值卻均為20。原因就是count被static修飾,而name沒有使用 count修飾。
被static修飾符修飾的數據成員或方法成員被稱為靜態成員,或者類成員, 沒有被static修飾的,被稱為實例成員。static成員只被初始化一次,所有的對 象共享,因此count會輸出兩個20。實例成員只有當初始化對象的時候才初始化 ,每次創建對象,都會被初始化一次。name在user1和user2被創建時,初始化了 2次,因此最終輸出的是Rose和Kate。
另外,static成員,由於是類共享的,所以不僅可以使用對象調用,也可以 使用類名調用。在static方法中,不能夠直接使用非靜態的成員,如果使用,必 須初始化對象,調用。如過在上面示例的User.java中有如下代碼,會發生編譯 錯誤。
public static void test(){
setName("test");
}
可以修改如下:
public static void test(){
User user=new User();
user.setName("test");
}
千萬不要盲目的把成員聲明為static,一定要理解static成員的特點,否則 會造成雖然語法正確,但是邏輯錯誤的後果。