本文精選 12 道極具迷惑性的 Java 代碼片段,涵蓋抽象方法語法、局部變數修飾符、final 語義、介面變數隱含屬性、靜態上下文限制等核心語言規則。每題附帶錯誤定位、原因分析與修正方案。
abstract class Name {
private String name;
public abstract boolean isStupidName(String name) {} // 錯誤:花括號
}
錯誤:abstract 方法以分號結尾,不可有花括號。修正:public abstract boolean isStupidName(String name);
void doSomething() {
private String s = ""; // 錯誤:private 修飾局部變數
int l = s.length();
}
錯誤:局部變數前不能加 private/public/protected。final 可修飾局部變數(非存取修飾符)。修正:移除 private。
abstract class Something {
private abstract String doSomething(); // 錯誤:private abstract
}
錯誤:abstract 方法旨在被子類實現,不可為 private(同理不可為 final)。修正:protected abstract String doSomething(); 或 public。
public int addOne(final int x) {
return ++x; // 錯誤:x 為 final,不可自增
}
錯誤:final int x 表示參數引用不可變更。修正:移除 final 或用區域變數 int y = x + 1; return y;。
public void addOne(final Other o) {
o.i++; // 正確:修改的是物件欄位,而非參考 o 本身
}
正確:final 限制參考變數 o 不能指向新物件(o = new Other() 錯誤),但可透過 o 修改物件可變狀態。
class Something {
int i; // 實例變數
public void doSomething() { System.out.println("i = " + i); }
}
正確:int i 為實例變數,預設值 0。輸出 i = 0。
class Something {
final int i; // 錯誤:final 實例變數未初始化
public void doSomething() { System.out.println("i = " + i); }
}
錯誤:final 實例變數必須在建構子結束前賦值。修正:final int i = 0; 或在建構子中賦值。
public static void main(String[] args) {
Something s = new Something();
System.out.println(DOSomething()); // 錯誤:靜態上下文呼叫非靜態方法
}
public String DOSomething() { return "Do something ..."; }
錯誤:main 為 static,不可直接呼叫實例方法。修正:s.DOSomething()。
// 檔名 OtherThing.java
class Something { // 非 public 類別
private static void main(String[] args) { ... }
}
正確:只有 public class 強制與檔名同名。非 public 類別檔名可任意。
interface A { int x = 0; } // 隱含 public static final
class B { int x = 1; }
class C extends B implements A {
public void pX() { System.out.println(x); } // 編譯錯誤:x 歧義
}
錯誤:x 同時匹配 A.x 與 B.x。修正:super.x (父類) 或 A.x (介面)。
interface Rollable extends Playable, Bounceable {
Ball ball = new Ball("PingPang"); // 實為 public static final Ball ball = ...
}
class Ball implements Rollable {
public void play() {
ball = new Ball("Football"); // 編譯錯誤:嘗試修改 final 參考
}
}
錯誤:介面欄位隱含 public static final,ball 參考不可變更。修正:介面中勿定義可變狀態,或改為方法 Ball getBall();。
正確:內部類別物件持有外部類別物件隱含引用,可存取外部所有成員(含 private)。靜態巢狀類別則無此引用,僅能存取外部 static 成員。
| 術語 | 全稱 | 核心作用 |
|---|---|---|
| JAXP | Java API for XML Parsing | 統一 DOM/SAX/XSLT 解析介面,屏蔽具體實現 |
| JAXM | Java API for XML Messaging | SOAP 訊息傳輸與存取 API |
| WSDL | Web Services Description Language | XML 格式描述服務端點、操作、訊息、綁定 |
| SOAP | Simple Object Access Protocol | XML 編碼訊息交換的輕量級協定 |
| UDDI | Universal Description, Discovery, Integration | Web 服務註冊發現標準,電子商務服務目錄 |