| 修飾對象 | 特性 | 關鍵行為 |
|---|---|---|
| 變數(靜態變數/類別變數) | 相當於全域變數 | 屬於類別,不屬於實例;所有實例共享同一份記憶體 |
| 方法(靜態方法/類別方法) | 類別載入時即就緒 | 無需建立實例即可透過「類別名.方法名」直接呼叫;優先於建構子執行 |
靜態初始化區塊 static { } | 類別載入時自動執行 | 僅執行一次,常用於靜態資源初始化(如載入驅動、讀取設定檔) |
// MyStatic.java
package study;
public class MyStatic {
public static int sta = 0;
public int st = 0;
// 靜態初始化區塊:類別載入時最先執行
static {
System.out.println("some static");
}
public static void myStatic() {
System.out.println("static method");
}
public MyStatic() {
System.out.println("constructor");
}
public void demo() {
System.out.println("instance method");
}
}
// Test.java
package study;
public class Test {
public static void main(String[] args) {
MyStatic my = new MyStatic(); // 1. 載入類別 → 執行 static 區塊 → 執行建構子
int demo = my.st; // 2. 存取實例變數
my.demo(); // 3. 呼叫實例方法
MyStatic.myStatic(); // 4. 直接呼叫靜態方法
int a = MyStatic.sta; // 5. 直接存取靜態變數
// int b = MyStatic.st; // 編譯錯誤:非靜態變數需實例化後才能存取
}
}
some static ← static 區塊最先執行(類別載入階段)
constructor ← 建構子執行
demo ← 實例方法
static method ← 靜態方法
結論:JVM 載入類別時,依序執行 static 區塊 → 靜態變數初始化 → 建構子 → 實例方法。靜態成員不依賴實例存在。
Math、Collections)、常數定義、單例模式皆仰賴 staticthis、super 關鍵字不可在靜態語境中使用volatile、AtomicInteger 或同步機制)java.lang.Math、StringUtils、DateUtils 等皆為全 static 方法getInstance()public static final int MAX_SIZE = 100;