方法是 Java 代碼復用的基本單元。理解靜態方法(static)與實例方法的調用機制、this 隱式傳遞、以及靜態上下文中不可直接調用實例成員的限制,是編寫正確 Java 程序的前提。本文通過 HelloWorld 變體演示核心概念與常見錯誤。
public class Lession2 {
public static void main(String[] args) {
// 直接調用靜態方法
hello1();
// 實例方法需創建對象調用
Lession2 lession2 = new Lession2(); // 變量名建議小寫開頭
lession2.hello2();
}
public static void hello1() {
System.out.println("Hello World-1!");
}
public void hello2() {
System.out.println("Hello World-2!");
}
}
| 調用位置 | 靜態方法 | 實例方法 |
|---|---|---|
| 靜態方法中(如 main) | ✅ 直接調用 hello1() 或 Lession2.hello1() | ❌ 不可直接調用,需 new Lession2().hello2() |
| 實例方法中 | ✅ 直接調用或 類名.方法() | ✅ 直接調用 hello2()(隱式 this.hello2()) |
static
public void hello1() { ... }
在 main 中直接調用 hello1() → 編譯錯誤:
Cannot make a static reference to the non-static method hello1() from the type Lession2原因:靜態上下文無
this,無法確定調用哪個實例的方法。- 變量命名不規範
→ 編譯錯誤:Lession2 123l = new Lession2(); // 數字開頭、包含字母 l 混淆Syntax error on token "123l", delete this token規則:變量名必須字母/下劃線/$ 開頭,區分大小寫,避免關鍵字。
- 同名靜態與實例方法
→ 編譯錯誤:public static void hello1() { ... } public void hello1() { ... } // 同名同參Duplicate method hello1() in type Lession2Java 不支持按靜態/實例區分重載,簽名衝突。
- 實例變量調用靜態方法
編譯通過,運行正常,但編譯器會發出警告:lession2.hello1(); // 編譯通過,但不推薦static method should be called via class name。靜態方法屬於類,不屬於實例,建議用Lession2.hello1()。
static 方法(如 Math.max、Collections.sort)public static void main(String[] args) 固定格式,args 可改名但類型必須 String[]lession2 而非 obj、l)public static void main(String[] args) throws Exception 統一拋出異常,省去 try-catch掌握靜態與實例方法的調用邊界、this 隱式傳遞機制、以及編譯器對非法調用的精準攔截,能讓你在 Java 入門階段避開 90% 的語法坑,建立正確的物件導向思維。