1. 程式人生 > >java中static關鍵字的用法

java中static關鍵字的用法

static是靜態修飾符,在java中,static可以作用在變數、方法、類上,以及還可以在類中獨立成一個靜態塊。被static修飾的,一般都是屬於類本身的,在類載入的過程中,靜態的變數就會被初始化,static靜態塊就會被執行,靜態的方法載入到記憶體,關於靜態的東西會單獨放到一段記憶體中,這樣對於類的多個例項物件來說,訪問靜態的東西,其實訪問的都是同一塊記憶體空間。

靜態變數

按照是否靜態,對成員變數可以分為兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。兩者的區別是:

對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。

對於例項變數,每建立一個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。 

靜態方法

靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用thissuper關鍵字,不能直接訪問所屬類的例項變數和例項方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。

靜態方法只能訪問靜態成員變數和靜態成員方法,非靜態方法可以訪問非靜態成員方法和非靜態成員變數,也可以訪問靜態成員變數和靜態成員方法

靜態類

一個普通類是不能宣告為靜態的,只有內部類才可以。內部類被宣告為靜態的,就可以直接像普通類一樣被訪問。

package test;

import test.OuterClass.InnerClass;

public class Test {	
	public static void main(String[] args) {
//		OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
		InnerClass innerClass = new InnerClass();
		innerClass.a();
	}
}

class OuterClass{

	static class InnerClass{
		public void a(){
			System.out.println("OuterClass的內部類InnerClass的方法a");
		}
	}
}

靜態塊

static程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。

package test;

public class Test {	
	private static String str;
		
	static{
		Test test = new Test();
		test.a();
	}
	static{
		str="1";
		System.out.println(str);
	}
	static{
		str="2";
		System.out.println(str);
	}
	
	public void a(){
		System.out.println("Test中的a方法");
	}
	public static void main(String[] args) {

	}
}

執行結果:

Test中的a方法
1
2