我們先來看下面這段代碼:
public class Test {
public static void main(String[] args) {
String name = "沉默是金";
// \u000dname="言多必失";
System.out.println(name);
}
}
運行後得出的結果如下:
言多必失
盡然不是沉默是金,,,,,有人會問:天,爲什麼?明明有//註釋符號啊!感覺這十來年的 Java 算是白學了。老師說註釋是不會執行的;就連《編程思想》裏也說註釋是不會執行的。那現在誰能告訴我這到底爲什麼?
哈哈哈哈,讓小編來揭祕:
單純從代碼上來看,問題應該出在那串特殊的字符上——\u000d,\u000d 雖然看上去比較陌生,但我知道它是一個 Unicode 字符。問了一下搜索引擎後,知道它代表一個換行符——一種恍然大悟的感覺啊。我知道,Java 編譯器不僅會編譯代碼,還會解析 Unicode 字符。
將上面這段代碼編譯後的字節碼反編譯一下,於是我看到下面這段代碼:**
public class Test {
public Test() {
}
public static void main(String[] args) {
String name = "沉默是金";
name = "言多必失";
System.out.println(name);
}
}
咦,兩個反斜槓 // 真的不見了,這可以確定一點——註釋確實是不會執行的。只不過 \u000d 把 name=“沉默王三”; 擠到了 // 註釋的下一行,就好像下面這段代碼的樣子:
public class Test {
public static void main(String[] args) {
String name = "沉默是金";
//
name="言多必失";
System.out.println(name);
}
}
那這算不算是 Java 的 bug 呢?
說算也不算。因爲通過允許 Java 源代碼包含 Unicode 字符,可以確保在世界上任何一個區域編寫的代碼在其他地方執行。只能說 \u000d 是一種例外吧。