static 表示「屬於類」而非「屬於實例」。被修飾的成員:
類名.靜態成員 直接訪問,無需創建對象。| 特性 | 靜態變量 | 實例變量 |
|---|---|---|
| 記憶體分配 | 類加載時一次分配 | 每創建實例分配一次 |
| 副本數量 | 單份共享 | 每個實例一份 |
| 訪問方式 | 類名/對象均可(推薦類名) | 僅能通過對象 |
| 生命週期 | 隨類卸載結束 | 隨對象銷毀結束 |
this/super:無實例上下文。public class StaticDemo {
private static int a;
private int b;
static { a = 3; System.out.println("靜態塊1: " + a); }
static { a = 4; System.out.println("靜態塊2: " + a); }
static { a = 5; System.out.println("靜態塊3: " + a); }
public StaticDemo() { System.out.println("構造器"); }
public static void main(String[] args) {
new StaticDemo();
}
}
/* 輸出順序:
靜態塊1: 3
靜態塊2: 4
靜態塊3: 5
構造器
*/
執行規則:
private static int internalCounter; // 僅類內可見
public static final String VERSION = "1.0"; // 全域常量
protected static void initConfig() {} // 子類可見
private 限制訪問範圍,static 決定存儲方式,兩者正交組合。
JVM 啟動時無需實例化主類即可直接調用 public static void main(String[] args),進入程序入口。
AtomicInteger、ThreadLocal 或鎖。