Die Antwort lautet nein - die if-Anweisung ist nicht wie eine switch-Anweisung ohne Unterbrechung. Beginnen wir mit diesem Teil Ihrer Frage:
Wenn boolean_expression_1 wahr wäre, würde es prüfen, ob boolean_expression_2 wahr ist?
Wir können die Antwort mit diesem Programm finden. Der Trick ist, dass wir eine Methode als unseren booleschen Ausdruck aufrufen und System.out.println () verwenden, um zu sehen, ob die Methode ausgeführt wird. Auf diese Weise wissen wir, ob der Ausdruck ausgewertet wurde. Hier ist das Programm:
public class IfElseExample {
private static boolean booleanExpression1() {
System.out.println("Expression 1 is being evaluated.");
return true;
}
private static boolean booleanExpression2() {
System.out.println("Expression 2 is being evaluated.");
return true;
}
public static void main(String[] args) {
if (booleanExpression1())
System.out.println("Statement 1 is executed");
else if (booleanExpression2())
System.out.println("Statement 2 is executed");
else
System.out.println("Default statement is executed");
}
}
Sie werden sehen, dass der zweite boolesche Ausdruck nicht ausgewertet wird. Dieses Verhalten wird wahrscheinlich verständlicher, wenn Sie einige Klammern setzen (was in den meisten Fällen eine gute Angewohnheit ist):
if (booleanExpression1()) {
System.out.println("Statement 1 is executed");
} else {
if (booleanExpression2()) {
System.out.println("Statement 2 is executed");
} else {
System.out.println("Default statement is executed");
}
}
Auf diese Weise zeigt der Compiler Ihre ursprüngliche if-Kette an. Wie Sie jetzt sehen können, ist das zweite "if" eine einzelne Anweisung für sich und befindet sich als solche nicht auf derselben Ebene wie die erste if-Anweisung. Wenn Sie mehr if-Anweisungen verketten, werden diese noch tiefer verschachtelt.
Sie haben auch gefragt, warum die switch-Anweisung eine break-Anweisung benötigt. Dies liegt daran, dass die switch-Anweisung nicht intern mit einer Kette von if-Anweisungen implementiert wird (und die if-Anweisung basiert auch nicht auf switch-Anweisungen). Das könnte man erwarten
switch(controllingExpression()) {
case 42: System.out.println("A");
case 43: System.out.println("B");
default : System.out.println("z");
}
wird vom Compiler in etwas übersetzt wie:
if (controllingExpression() == 42) {
System.out.println("A");
} else if (controllingExpression() == 43) {
System.out.println("B");
} else {
System.out.println("z");
}
Das ist nicht der Fall. Stattdessen wird eine versteckte Skip-Anweisung verwendet:
int x = numberOfStatementsToSkipFor(controllingExpression());
skip x // hidden skip the next x statements byte code instruction
System.out.println("A");
System.out.println("B");
System.out.println("z");
Die Methode numberOfStatementsToSkipFor () gibt 0 für 42, 1 für 43 und 2 für alles andere zurück. Jetzt wird klar, warum dieses Programm produzieren könnte
A
B
z
oder
B
z
oder nur
z
aber nie
A
B
ohne das 'z'. Aber natürlich wäre es schön, wenn wir das schaffen könnten. Und wir können break verwenden, das in eine andere Skip-Anweisung übersetzt wird. Also, wenn Sie alle Fallzweige unterbrechen
switch(controllingExpression()) {
case 42: {
System.out.println("A");
break;
}
case 43: {
System.out.println("B");
break;
}
default : System.out.println("z");
}
Der Compiler erstellt Folgendes:
int x = numberOfStatementsToSkip(controllingExpression());
skip x; // hidden skip the next x statements byte code instruction
System.out.println("A");
skip 3; //"B" + skip + "z"
System.out.println("B");
skip 1;
System.out.println("z");