核心定義
| 分類 | 關鍵字 | 歸屬 | 生命週期 | 調用方式 |
| 實例變量 | 無 static | 對象 | 隨對象創建/銷毀 | 對象.變量 |
| 類變量(靜態變量) | static | 類 | 類加載至卸載 | 類名.變量 / 對象.變量 |
| 實例方法 | 無 static | 對象 | 隨對象 | 對象.方法() |
| 類方法(靜態方法) | static | 類 | 類加載至卸載 | 類名.方法() / 對象.方法() |
代碼演示:靜態變量共享
class TiXing {
float up, height;
static float down; // 類變量
TiXing(float x, float y, float z) {
up = x; height = y; down = z; // 每次 new 都會覆蓋 down!
}
}
public class Test {
public static void main(String[] args) {
TiXing one = new TiXing(1, 2, 3);
System.out.println("one.down = " + one.down); // 3
TiXing two = new TiXing(4, 5, 6);
System.out.println("one.down = " + one.down); // 6 ← 被覆蓋!
System.out.println("two.down = " + two.down); // 6
System.out.println("TiXing.down = " + TiXing.down); // 6
}
}
關鍵點:構造器對 static 變量賦值會影響所有實例,通常應在靜態代碼塊或聲明處初始化。
訪問權限矩陣
| 方法類型 | 可訪問實例變量 | 可訪問類變量 | 可用 this/super |
| 實例方法 | ✅ | ✅ | ✅ |
| 類方法 | ❌ | ✅ | ❌ |
代碼驗證
class TiXing {
private float up, height;
private static float down;
TiXing(float x, float y, float z) { up=x; height=y; down=z; }
// 實例方法:可訪問所有
public void display() {
System.out.println("up=" + up + " height=" + height + " down=" + down);
}
// 類方法:不可訪問實例變量
public static void change(float n) {
down = n; // ✅
// System.out.println(height); // ❌ 編譯錯誤
}
}
最佳實踐
- 工具類、常量、單例模式用
static
- 實體狀態用實例變量
- 靜態方法中絕不直接訪問實例成員
- 靜態變量初始化優先用靜態代碼塊
static { ... }