static 靜態變量
定義格式
靜態變量由static關鍵字修飾的變量
public static int staticVariable = 1 ; //定義靜態變量
public int normolVariable = 2 ; //普通變量
調用方法
我們現在example27類中寫一個普通方法
public class example27 {
public void test(int a) {
System.out.println(a);
}
}
然後在example28中寫一個靜態變量並測試,我們由example27中的普通方法來使用example28中的靜態變量
public class example28 {
public static int staticVariable = 1 ; //定義靜態變量
public int normalVariable = 2 ; //普通變量
public static void main(String args[]) {
example27 example2 = new example27() ;
example2.test(staticVariable); //由靜態變量所屬類之外的類使用這個靜態變量
}
}
使用場景
靜態變量的強大之處可以在於由靜態變量所屬類之外的類使用這個靜態變量。如 我們定義的通用異常錯誤類,很多異常狀態需要被大量的訪問,所以可以將狀態信息設置成靜態變量讓其他的類更方便的去使用。
內存分配訪問
在類初始化的時候,靜態變量不同於其他的變量,靜態變量會在類中單獨的分一塊特殊的公共區域,這塊區域中有一個地址就是我們的靜態地址,靜態變量就是指向這塊地址的變量。
靜態變量在類進行初始化時候便分配了內存。
普通變量只有類進行實例化的時候進行內存分配。
static 靜態方法
定義格式
用static修飾的方法叫靜態方法
public static void staticTest() {
System.out.println("static text");
}
調用方法
public class example27 {
public static void staticTest(int variable) {
System.out.println("static text");
}
}
public class example28 {
public static int staticVariable ; //定義靜態變量
public int normalVariable = 2 ; //普通變量
public static void main(String args[]) {
Example27.staticTest(staticVariable) ; //不需要實例化即可調用靜態方法
}
}
注意一點:如果在static方法內訪問一個非靜態的成員變量這是錯誤的,因爲在類內初始化的時候還沒有給普通成員變量分配內存
public int b ;
public static void staticTest(int variable) {
System.out.println("static text");
b++ ; //錯誤
}
如果想使用普通變量,需要通過方法接口傳入。
內存分配
靜態方法和靜態變量都是在類加載後便有了生命。
對象則是在實例化之後纔有了生命
static 靜態塊
定義格式
static{代碼塊}
static {
int test=1 ;
System.out.println(test);
example27.staticTest(staticVariable) ;
}
執行順序
1.static代碼塊在類的初始化時候最先執行,先於靜態變量和方法
2.存在多個static代碼塊時候,按他們在類中出現的順序執行
作用域
1.static代碼塊內定義的變量作用域代碼塊內部
2.代碼塊也只能調用靜態變量和靜態方法
總結
1.jvm只爲每個類的static代碼塊分配一次內存
2.static{}塊最先被執行
3.訪問靜態變量要先訪問代碼塊實例化的類