核心規則
靜態方法不能直接訪問非靜態成員(字段/方法),因靜態方法屬於類,加載時無實例對象,非靜態成員依附於實例。
main方法特殊性
public static void main(String[] args) {
int localVar = 10; // 局部變量,棧上,非成員
MyClass obj = new MyClass(); // 創建實例
obj.instanceField = 20; // 通過實例訪問非靜態字段 ✓
obj.instanceMethod(); // 通過實例調用非靜態方法 ✓
// instanceField = 30; // 編譯錯誤:非靜態字段不可直接訪問
}
關鍵區別
| 概念 | 存儲位置 | 生命周期 | 訪問方式 |
| 靜態字段 | 方法區 | 類加載~卸載 | 類名. / 實例. |
| 非靜態字段 | 堆(對象內) | 對象創建~GC | 實例. |
| 局部變量 | 棧(棧幀內) | 方法調用~返回 | 直接變量名 |
| main參數args | 堆(數組對象) | main執行期間 | args[i] |
常見誤區
- 以為
main是static所以能訪問類中所有字段 → **錯**,只能訪問static字段。
- 以為
main裡定義的變量是成員變量 → **錯**,是局部變量。
- 靜態方法中
this → **編譯錯誤**,靜態上下文無this。
正確訪問模式
public class Demo {
static int staticField = 1;
int instanceField = 2;
static void staticMethod() {
System.out.println(staticField); // ✓
// System.out.println(instanceField); // ✗
Demo d = new Demo();
System.out.println(d.instanceField); // ✓ 通過實例
}
void instanceMethod() {
System.out.println(staticField); // ✓ 實例方法可訪問靜態
System.out.println(instanceField); // ✓ 隱式this.instanceField
}
}
- 上一篇文章: MySQL跨數據庫移動表:CREATE TABLE ... LIKE + INSERT SELECT 或 RENAME TABLE
- 下一篇文章: Linq to SQL修改數據主鍵衝突:應查詢實體再修改而非新建插入
Copyright ©
程式碼之家 All Rights Reserved