最后,学以致用,实践出真知。我们一起看一下开头抛出的问题吧,为什么注释行会被执行。看一下它的字节码指令就知道了。
public class TestAnno { public static void main(String[] args) { String str = "张三"; // \u000d str="李四"; System.out.println(str); } } //这里就是从常量池中取出一个字符串“张三”,然后加载到操作数栈 0 ldc #2 <张三> //从操作数栈把这个字符串引用存储到局部变量表中 2 astore_1 //从常量池中取出一个字符串“李四”,然后加载到操作数栈 3 ldc #3 <李四> //可以发现和上边一样都是astore_1,说明指向的是同一个引用 str。 //若定义另外一个str2赋值给“李四”,这个操作指令肯定就不同了。 5 astore_1 //访问的是System类的静态属性out,我们知道它的类型是PrintStream 6 getstatic #4 <java/lang/System.out> //将out这个引用加载到操作数栈栈顶,以便后边操作它 9 aload_1 //调用out的实例方法 println ,用于打印结果到控制台 10 invokevirtual #5 <java/io/PrintStream.println> //main方法返回值为void 13 return这里就不用再多余解释了吧,可以从字节码指令中看到,后边的 str="李四" 被编译器执行了。