if 是 Java 控制流的基石,根據布爾表達式決定是否執行代碼塊。
// 單行語句可省略大括號 (不推薦,易出錯)
if (score >= 60) System.out.println("及格");
// 標準寫法:始終使用大括號
if (score >= 60) {
System.out.println("及格");
System.out.println("繼續努力");
}
int age = 17;
if (age >= 18) {
System.out.println("成年人");
} else {
System.out.println("未成年人");
}
int score = 85;
if (score >= 90) {
System.out.println("優秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
// 執行流程:自上而下判斷,匹配第一個 true 執行對應塊,其餘跳過
boolean hasTicket = true;
boolean isVip = false;
if (hasTicket) {
if (isVip) {
System.out.println("VIP 通道入場");
} else {
System.out.println("普通通道入場");
}
} else {
System.out.println("請購票");
}
// 建議:扁平化邏輯,使用邏輯運算符
if (hasTicket && isVip) { ... }
else if (hasTicket) { ... }
else { ... }
表達式形式,可賦值給變量,適合簡單雙分支。
int a = 10, b = 20;
int max = (a > b) ? a : b; // 返回 a 或 b 中較大值
String status = (age >= 18) ? "成年" : "未成年";
// 等價於:
// String status;
// if (age >= 18) status = "成年"; else status = "未成年";
public class OfficeDemo {
public static void main(String[] args) {
// 模擬:黃文強在不在?
boolean huangInOffice = false; // 今天不在
System.out.println("=== 開始查詢 ===");
if (huangInOffice) {
System.out.println("回覆:在工位上");
} else {
System.out.println("回覆:他不在(熱心同事代答)");
}
System.out.println("=== 查詢結束 ===");
}
}
Object obj = "Hello Java 17";
// 傳統寫法
if (obj instanceof String) {
String s = (String) obj; // 需要強轉
System.out.println(s.length());
}
// 模式匹配 (JDK 16 正式)
if (obj instanceof String s) { // 直接聲明並賦值模式變量
System.out.println(s.length());
}
// 結合 switch 表達式 (JDK 17+)
String result = switch (obj) {
case String s -> "字符串長度: " + s.length();
case Integer i -> "整數值: " + i;
case null -> "空值";
default -> "其他類型: " + obj.getClass().getSimpleName();
};
System.out.println(result);
| 原則 | 說明 | 反例 | 正例 |
|---|---|---|---|
| 始終用大括號 | 防止維護時漏加語句導致邏輯錯誤 | if(x>0) doA(); doB(); | if(x>0){doA();} doB(); |
| 條件順序優化 | 把最可能 true/false、計算最廉價的條件放前面 (短路求值) | if(expensive() && simple()) | if(simple() && expensive()) |
| 避免深層巢狀 | 超過 3 層提取方法、用衛語句、狀態模式 | 4+ 層 if-else | 提取方法、Guard Clauses |
| 布爾變量命名 | 用 is/has/can/should 開頭,正向語義 | boolean notReady = false; | boolean isReady = true; |
| == true/false | 絕不寫 if(flag == true) | if(isValid == true) | if(isValid) |
| 浮點數比較 | 絕不直接 ==,用誤差範圍 | if(d == 0.3) | if(Math.abs(d - 0.3) < 1e-9) |
// 錯誤 1: 單個 = 賦值而非比較
if (x = 5) { ... } // 編譯錯誤 (int 不能轉 boolean),但 boolean 類型會誤賦值!
boolean flag = false;
if (flag = true) { ... } // 永遠為 true!正確: if (flag)
// 錯誤 2: 分號吞噬 if
if (x > 0); { // if 體為空語句,大括號塊無條件執行
System.out.println("錯誤執行");
}
// 錯誤 3: 字符串用 == 比較內容
String s1 = new String("a");
String s2 = new String("a");
if (s1 == s2) { ... } // false! 比較引用。正確: s1.equals(s2)
if-else 是程序決策的核心。掌握 基礎語法、多重分支順序、三元運算符表達式、模式匹配現代語法、衛語句扁平化、短路求值優化,並堅守 大括號原則、布爾命名規範、浮點比較容差,即能寫出清晰、高效、可維護的條件邏輯。隨著 JDK 17+ 模式匹配成熟,複雜類型判斷將更加優雅。