我们先来看下面这段代码:
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 是一种例外吧。