Я написал этот простой класс Test
, чтобы увидеть, как Java оценивает алгебру boolean
на уровне Bytecode:
public class Test {
private static boolean a, b;
public static boolean method1(){
return !(a || b);
}
public static boolean method2(){
return !a && !b;
}
}
Если вы упростите method1()
с помощью DeMorgan Laws, вы должны получить method2()
. Посмотрев на Bytecode (используя javap -c Test.class), он выглядит так:
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":
()V
4: return
public static boolean method1();
Code:
0: getstatic #2 // Field a:Z
3: ifne 16
6: getstatic #3 // Field b:Z
9: ifne 16
12: iconst_1
13: goto 17
16: iconst_0
17: ireturn
public static boolean method2();
Code:
0: getstatic #2 // Field a:Z
3: ifne 16
6: getstatic #3 // Field b:Z
9: ifne 16
12: iconst_1
13: goto 17
16: iconst_0
17: ireturn
}
Итак, мой вопрос: почему method1()
и method2()
точно совпадают на уровне Bytecode?