2017-01-22 42 views
-3

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語句也包含否定。有人可以解釋這一點嗎?感謝提前。

+0

這種格式給了我癌症。 – alex

回答

0

看起來像編譯器看到block2的第一級'else'中有一些代碼,並且匹配if中沒有任何代碼,因此恢復條件以將不必要的'if-else'減少爲簡單的'if' 。

然後它在第二級if-else上深入研究,發現代碼無論變量狀態如何都不會做任何事情,因此會刪除整個第二級if-else。

此時,現在獨立的第一級'if'應該包含第二級塊代碼,但該塊只是被完全刪除,編譯器沒有「回來」再次檢查它,因此留下第一個'if'爲空。