什么,注销掉的代码被执行了。不可置信哇,来看代码:
package org.test;
public class Test {
public static void main(String[] args) {
String a = "我是初始化的的arn";
//u000da+= "我是注释掉的arn";
a += "我是修改后的的an";
System.out.println(a);
}
}
废话不多说,上结果:
我是初始化的的a
我是注释掉的a
我是修改后的的a
有图有真相:
为什么会如此呢,注释掉的信息怎么还可以执行呢?
其实在代码编译成 字节码 时,因 u000d 是换行的unicode表示,在编译成字节码时会认为是换行,导致注释的代码正确编译。
来看字节码:
public static void main( java .lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: ldc #2 // String 我是初始化的的arn
2: astore_1
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/ StringBuilder ;
14: ldc #6 // String 我是注释掉的arn
16: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: new #3 // class java/lang/StringBuilder
26: dup
27: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
30: aload_1
31: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
34: ldc #8 // String 我是修改后的的an
36: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
39: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
42: astore_1
43: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
46: aload_1
47: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
50: return
LineNumberTable:
line 5: 0
line 6: 3
line 7: 23
line 8: 43
line 9: 50
LocalVariableTable:
Start Length Slot Name Signature
0 51 0 args [Ljava/lang/String;
3 48 1 a Ljava/lang/String;
}
Source File : "Test.java"
因此注释的时候,不可以带上 u000d 。
谨记!!!!