Câu trả lời là không - câu lệnh if không giống như câu lệnh switch mà không ngắt. Hãy để chúng tôi bắt đầu với phần này của câu hỏi của bạn:
nếu boolean_expression_1 là đúng, nó sẽ kiểm tra xem boolean_expression_2 có đúng không?
Chúng ta có thể tìm thấy câu trả lời với chương trình này. Thủ thuật là, chúng ta gọi một phương thức là boolean_expression của chúng ta và sử dụng System.out.println () để xem, nếu phương thức được thực thi. Bằng cách này, chúng tôi biết nếu biểu thức đã được đánh giá. Đây là chương trình:
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");
}
}
Bạn sẽ thấy rằng biểu thức boolean thứ hai không được đánh giá. Hành vi này có thể trở nên dễ hiểu hơn nếu bạn đặt trong một số dấu ngoặc (đó là một thói quen tốt trong hầu hết các trường hợp):
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");
}
}
Đây là cách, trình biên dịch xem if-chain gốc của bạn. Như bạn có thể thấy bây giờ, "if" thứ hai là một câu lệnh riêng của nó và như vậy nó không cùng cấp với câu lệnh if đầu tiên. Nếu bạn xâu chuỗi các câu lệnh if nhiều hơn, chúng sẽ được lồng sâu hơn nữa.
Bạn cũng hỏi, tại sao câu lệnh switch cần một câu lệnh break. Điều này là do câu lệnh switch không được triển khai bên trong với một chuỗi câu lệnh if (cũng không phải là câu lệnh if dựa trên câu lệnh switch). Bạn có thể mong đợi rằng
switch(controllingExpression()) {
case 42: System.out.println("A");
case 43: System.out.println("B");
default : System.out.println("z");
}
được dịch bởi trình biên dịch thành một cái gì đó như:
if (controllingExpression() == 42) {
System.out.println("A");
} else if (controllingExpression() == 43) {
System.out.println("B");
} else {
System.out.println("z");
}
Đây không phải là trường hợp. Thay vào đó, nó sử dụng một câu lệnh bỏ qua ẩn:
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");
Phương thức numberOfStatementsToSkipFor () trả về 0 cho 42, 1 cho 43 và 2 cho mọi thứ khác. Bây giờ nó trở nên rõ ràng tại sao chương trình này có thể sản xuất
A
B
z
hoặc là
B
z
hoặc chỉ
z
nhưng không bao giờ
A
B
không có 'z'. Nhưng rõ ràng sẽ tốt nếu chúng ta có thể làm điều này. Và chúng ta có thể bằng cách sử dụng break mà được dịch sang một câu lệnh bỏ qua khác. Vì vậy, nếu bạn đặt break vào tất cả các trường hợp chi nhánh
switch(controllingExpression()) {
case 42: {
System.out.println("A");
break;
}
case 43: {
System.out.println("B");
break;
}
default : System.out.println("z");
}
trình biên dịch sẽ tạo ra điều này:
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");