java static關鍵字

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();
	    }
	  }
	
	
}


發佈了27 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章