La respuesta es no: la instrucción if no es como una instrucción switch sin interrupción. Comencemos con esta parte de su pregunta:
si boolean_expression_1 fuera verdadero, ¿comprobaría si boolean_expression_2 es verdadero?
Podemos encontrar la respuesta con este programa. El truco es que llamamos a un método como nuestra expresión booleana y usamos System.out.println () para ver si el método se ejecuta. De esta manera sabemos si se evaluó la expresión. Aquí está el programa:
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");
}
}
Verá que la segunda expresión booleana no se evalúa. Este comportamiento probablemente se vuelve más comprensible si coloca algunos corchetes (lo cual es un buen hábito en la mayoría de los casos):
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");
}
}
De esta manera, el compilador ve su cadena if original. Como puede ver ahora, el segundo "if" es una declaración única y, como tal, no está en el mismo nivel que la primera declaración if. Si encadena más sentencias if, estas se anidan aún más profundamente.
También preguntó por qué la declaración de cambio necesita una declaración de interrupción. Esto se debe a que la instrucción switch no se implementa internamente con una cadena de instrucciones if (ni la instrucción if se basa en instrucciones switch). Puedes esperar que
switch(controllingExpression()) {
case 42: System.out.println("A");
case 43: System.out.println("B");
default : System.out.println("z");
}
se traduce por el compilador en algo como:
if (controllingExpression() == 42) {
System.out.println("A");
} else if (controllingExpression() == 43) {
System.out.println("B");
} else {
System.out.println("z");
}
Este no es el caso.En su lugar, utiliza una declaración de omisión oculta:
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");
El método numberOfStatementsToSkipFor () devuelve 0 para 42, 1 para 43 y 2 para todo lo demás. Ahora queda claro por qué este programa podría producir
A
B
z
o
B
z
o solo
z
pero nunca
A
B
sin la 'z'. Pero claramente sería bueno si pudiéramos hacer esto. Y podemos usar break que se traduce en otra declaración de omisión. Entonces, si pones un salto en todas las ramas de casos
switch(controllingExpression()) {
case 42: {
System.out.println("A");
break;
}
case 43: {
System.out.println("B");
break;
}
default : System.out.println("z");
}
el compilador producirá esto:
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");