靜態方法和靜態變量
static關鍵字最基本的用法如下:
- static修飾的變量屬於類變量,可以直接通過類名.變量名來進行引用,不需要new出來一個類
- static修飾的方法屬於類方法,可以直接通過類名.方法名來進行引用,不需要new出來一個類
被static修飾的變量和方法屬於類的靜態資源,從JVM的類加載機制來說,靜態資源是在類初始化的時候加載的,而非靜態資源是類new的時候加載的,類的初始化早於類的new,基於此我們可以區分以下三個常見問題
- 靜態方法能不能引用非靜態資源?不能
- 靜態方法能不能引用靜態資源?能
- 非靜態方法能不能引用靜態資源?能
public class StaticTest {
public static int total=15;
public static void say(){
System.out.println(total);
}
public void print(){
say();
System.out.println(total);
}
}
靜態塊
靜態代碼塊也是static的重要應用之一,和靜態遍歷和方法一樣,靜態代碼快裏面的代碼只執行一次,而且在類的初始化的時候執行的
- 靜態資源的加載順序是嚴格按照靜態資源的定義順序來加載的
- 靜態代碼塊對於定義在它之後的靜態變量,可以賦值,但是不能訪問。
- 靜態代碼塊是嚴格按照父類靜態代碼塊->子類靜態代碼塊的順序加載的,且只加載一次。
static修飾類
這個用得相對比前面的用法少多了,static一般情況下來說是不可以修飾類的,如果static要修飾一個類,說明這個類是一個靜態內部類(注意static只能修飾一個內部類),也就是匿名內部類。