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) {
}
}
}
如果人們可以觀察到塊1和在生成的類文件BLOCK2之間的diffence。人們可以理解,java編譯器如何以智能的方式工作。編譯器檢查block1中的第一個「if else if」條件語句,並發現在這些語句中需要執行某些操作(即打印語句),因此它生成的block1與java源代碼中的一樣。在第二塊中,我的意思是在block2中,編譯器發現在if -esle if語句中沒有什麼要執行,因此它會轉換並重置block2,因爲您可以看到上面的類文件。編譯器只是根據布爾值將「if else if block」轉換爲將被執行或不被執行的if語句。
在第二個塊if語句也包含否定。有人可以解釋這一點嗎?感謝提前。
這種格式給了我癌症。 – alex