static關鍵字
當我們定義一個類的時候,我們都是在描述那個類的外觀與行爲。沒有創建任何類的對象的時候,數據存儲空間沒有被分配,類中的方法也不會被調用。
比如:public class robber {
public void fun(){}
public static void main(String args[])
{
fun();//這樣是編譯不過的,必須得有robber類的對象,才能使用這個方法
robber r=new robber();
r.fun();
}
}
但是,很多情況下我們只是想要給某一個特定的域(或者說變量)只分配一個存儲空間,比如某些變量我們只需要初始化一次,不需要沒生成一個對象就分配此對象的存儲空間。
或者說,我們即使不產生類的對象,也可以調用類的方法。
通過static可以滿足這兩方面的需要。
static 變量
public class robber {
static int i=0;
public static void main(String args[])
{
robber r1=new robber();
robber r2=new robber();
r1.i=1;
r2.i=2;
System.out.println(r1.i);
}
}
變量i是申明爲static的,所以,不管聲明多少個對象,只有一個i的存儲空間,可以看到通過r2對象改變的i的值爲2,r1對象的i值也變成了2.
static 方法
static方法一般稱作靜態方法,由於靜態方法不依賴於任何對象就可以進行訪問,因此對於靜態方法來說,是沒有this的,因爲它不依附於任何對象,既然都沒有對象,就談不上this了。並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,因爲非靜態成員方法/變量都是必須依賴具體的對象才能夠被調用。
但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變量,但是在非靜態成員方法中是可以訪問靜態成員方法/變量的。
因此,如果說想在不創建對象的情況下調用某個方法,就可以將這個方法設置爲static。我們最常見的static方法就是main方法,至於爲什麼main方法必須是static的,現在就很清楚了。因爲程序在執行main方法的時候沒有創建任何對象,因此只有通過類名來訪問。
static 代碼塊
見:http://blog.csdn.net/mengxipiaoxue/article/details/45097991
import static
mport static(靜態導入)是JDK1.5中的新特性,一般我們導入一個類都用 import com.....ClassName;而靜態導入是這樣:import static com.....ClassName.*;這裏多了個static,還有就是類名ClassName後面多了個 .* ,意思是導入這個類裏的靜態方法。當然,也可以只導入某個靜態方法,只要把 .* 換成靜態方法名就行了。然後在這個類中,就可以直接用方法名調用靜態方法,而不必用ClassName.方法名的方式來調用。
將其與enum結合
package other;
public enum Signal {GREEN, YELLOW, RED,}
普通導入代碼
package leet;
import other.Signal;
//import static other.Signal.*;
public class EnumSwitch {
Signal color=Signal.RED;
public void change() {
switch(color) {
// Note that you don't have to say Signal.RED
// in the case statement:
case RED: color = Signal.GREEN;
break;
case GREEN: color = Signal.YELLOW;
break;
case YELLOW: color = Signal.RED;
break;
}
}
public String toString() {
return "The traffic light is " + color;
}
public static void main(String[] args) {
EnumSwitch t = new EnumSwitch();
for(int i = 0; i < 7; i++) {
System.out.println(t);
t.change();
}
}
}
通過import static導入代碼
package leet;
import other.Signal;
import static other.Signal.*;
public class EnumSwitch {
Signal color=RED;
public void change() {
switch(color) {
// Note that you don't have to say Signal.RED
// in the case statement:
case RED: color = GREEN;
break;
case GREEN: color = YELLOW;
break;
case YELLOW: color = RED;
break;
}
}
public String toString() {
return "The traffic light is " + color;
}
public static void main(String[] args) {
EnumSwitch t = new EnumSwitch();
for(int i = 0; i < 7; i++) {
System.out.println(t);
t.change();
}
}
}