non-static variable xxx cannot be referenced from a static context
static 字段/方法)屬於**類**,類加載時即存在,**無需實例化**即可訪問。main)運行時**沒有隱式 this 引用**,無法知道「哪個對象的非靜態字段」,因此編譯器禁止直接訪問。| 模式 | 代碼示例 | 適用場景 |
|---|---|---|
| 1. 將字段改為 static | static int count; | 真正屬於類級別的共享數據(如計數器、常量、單例) |
| 2. 實例化對象後訪問 | MyClass obj = new MyClass(); obj.field = 1; | 邏輯屬於對象行為,需在實例上操作 |
| 3. 將方法改為非靜態 | public void doWork() { ... } | 方法需訪問實例字段,且不需類級別調用 |
| 4. 傳入實例引用 | static void helper(MyClass obj) { obj.field = 1; } | 工具方法需操作外部傳入的對象 |
public class Game {
int score = 0; // 非靜態
public static void main(String[] args) {
score = 100; // ❌ 編譯錯誤
}
}
// 修復:new Game().score = 100; 或 static int score;
**優先使用實例成員**,靜態成員僅用於:工具方法、常量、單例、類級別共享狀態。**靜態上下文調用非靜態 = 設計味道**,提示可能職責劃分不清,重構為面向對象風格通常更佳。