用 if 做判断
程序需要根据数据做出反应:及格还是不及格,有货还是售罄,有效还是无效。if 语句就是 Java 根据条件选择运行哪段代码的方式。
if 在括号里接收一个布尔条件,只有当条件为 true 时,才运行花括号里的代码块:
条件 score >= 60 为 true,所以消息被打印出来。右花括号后面的那一行总会运行,因为它在 if 之外。把 score 改成 40,“passed”那一行就会被整个跳过。
与 C 不同,Java 不允许你在需要布尔值的地方放一个数字。if (score) 是编译错误:条件必须是一个真正的 boolean 表达式,由比较(>、>=、==、!=)或布尔逻辑(&&、||、!)构成。
加上 else
else 提供了“否则”的路径,也就是只在条件为 false 时运行的代码:
两个代码块中恰好有一个会运行:不会两个都运行,也不会一个都不运行。else 没有自己的条件,它只是接住 if 没有接住的所有情况。
用 else if 串联
当结果不止两种时,用 else if 把条件串起来。Java 从上往下逐个检查,运行第一个条件为 true 的代码块,然后跳过其余部分:
顺序很重要。84 先和 >= 90 比较(false),再和 >= 80 比较(true),于是停在 B,根本不会去检查更低的分数线。这也是为什么你不需要写 score >= 80 && score < 90:能走到第二个分支,就已经保证 score 低于 90。把范围最窄或优先级最高的条件放在最前面。
最后的 else 是兜底分支。在这里省略它会导致编译错误,因为打印 grade 时它可能还没有被赋值。
比较值:== 与 equals()
Java 中最常见的 if 语句 bug,就是用 == 比较字符串。对于基本类型(int、double、char、boolean),== 是正确的。对于对象,== 问的是“这是内存中的同一个对象吗?”,而 .equals() 问的是“它们的内容一样吗?”,你几乎总是想要后者:
只有第二条消息会打印出来。new String("yes") 和字面量 "yes" 是不同的对象,所以 == 为 false,但文本完全相同,所以 .equals() 为 true。经验法则:基本类型用 ==,对象用 .equals()。
当变量可能为 null 时,有个避免 NullPointerException 的安全技巧:把字面量放在前面,写成 if ("yes".equals(input)),因为字面量永远不会是 null。
组合与嵌套条件
你可以用 &&(与)、||(或)和 !(非)组合条件;当某个检查只有在前一个检查通过后才有意义时,也可以把一个 if 嵌套在另一个里面:
&& 和 || 会短路:在 a && b 中,如果 a 为 false,Java 根本不会求值 b。这在防止出错时很方便:if (s != null && s.length() > 0) 是安全的,因为 s 为 null 时长度检查会被跳过。能用 && 组合时,尽量别深层嵌套;扁平的代码比一座花括号金字塔更好读。
一个经典陷阱:单个 = 是赋值,== 才是比较。对 int 写 if (x = 5) 会编译错误(这是好事),但对 boolean 写 if (flag = true) 能通过编译,并且悄悄地完成了赋值,要特别留意。
三元运算符
如果你只想在两个值之间二选一,三元运算符 ?: 是一种紧凑的单行写法。condition ? a : b 读作“如果 condition 成立就是 a,否则就是 b”:
三元运算符会产生一个值,你可以直接把它赋给变量或作为参数传递。只在简单的取值选择时使用它;如果任何一个分支需要多条语句或真正的逻辑,完整的 if-else 会更易读,而嵌套的三元运算符很快就会变成一道谜题。
一个陷阱:省略花括号
当分支只有一条语句时,Java 允许你省略花括号,但这会招来一个不易察觉的 bug。缩进会骗人:
if (loggedIn)
System.out.println("Welcome");
System.out.println("Loading dashboard"); // NOT part of the if!
只有第一行受 if 控制;第二行总会运行,尽管缩进让人以为不是这样。始终使用花括号,哪怕只有一行,这一类错误就会彻底消失。
下一篇:switch
当每个分支检查的条件各不相同时,if-else if 链非常合适。但当你要把一个值和许多固定的可能性逐一比较时,比如星期名称、菜单选项或枚举,长长的 else if 阶梯就会变得重复。switch 语句正是为此而生,这就是下一篇的内容。
常见问题
Java 中如何写 if-else 语句?
在 if 后面的括号里写一个布尔条件,再在花括号里写要运行的代码,还可以加一个可选的 else 块,在条件为 false 时运行:if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }。条件必须求值为 boolean,Java 不像 C 那样接受 int。
Java 的 if 语句中 == 和 equals() 有什么区别?
== 比较两个引用是否指向同一个对象,而 .equals() 比较的是内容。对于 int 这样的基本类型,用 ==。对于对象,尤其是 String,要用 .equals():写 if (name.equals("Sam")),而不是 if (name == "Sam")。用 == 比较字符串是 Java 中最常见的 if 语句 bug。
Java 中的三元运算符是什么?
三元运算符 condition ? valueIfTrue : valueIfFalse 是一种会产生值的紧凑版 if-else。例如 String label = age >= 18 ? "adult" : "minor"; 会根据条件赋予两个值中的一个。它适合简单的取值选择;如果每个分支里都有逻辑要执行,就用完整的 if-else。