Я написал этот простой класс 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?