Java编译器足够聪明,可以在生成类文件时重置源代码。以下是了解这一点的示例。我创建了一个java文件Compiler.java编译器生成此文件的类文件为Compiler.class。
Compiler .java
public class Compiler {
public static void main(String[] args) {
boolean a = false;
boolean b = true;
{// block1
if (a) {
System.out.println("I am in if");
} else if (b) {
System.out.println("I am in else if");
} else {
System.out.println("I am in else");
}
}
{// block2
if (a) {
} else if (b) {
} else {
}
}
}
}
Compiler .class
public class Compiler {
public static void main(String[] args) {
boolean a = false;
boolean b = true;
if (a) {
System.out.println("I am in if");
} else if (b) {
System.out.println("I am in else if");
} else {
System.out.println("I am in else");
}
if (!a) {
}
}
}
如果可以在生成的类文件中观察到block1和block2之间的差异。可以理解java编译器如何以智能方式工作。编译器检查block1中的第一个“if else if”条件语句,并发现在这些语句中有一些要执行的内容(即print语句),因此它生成block1,就像在java源代码中一样。在第二个块中,我的意思是在block2编译器中发现if -esle if语句中没有任何内容要执行,所以它转换并重置block2,因为你可以看到上面的类文件。编译器只是将“if else if block”转换为if语句,该语句将根据布尔值执行或不执行。
在第二个块if语句中也包含否定。有人可以解释一下吗?谢谢你的提前。
答案 0 :(得分:0)
看起来编译器在块2的第一级“else”中看到了一些代码,并且在匹配中没有任何内容,因此将条件还原为将不必要的“if-else”减少为简单的“if”。
然后在第二级if-else上深入移动,发现无论变量状态如何,代码都不会执行任何操作,从而删除整个第二级if-else。
此时,现在单独的第一级'if'应该包含第二级块代码,但该块刚刚完全删除,编译器没有“回来”再次检查它,因此离开第一个'if'为空。