1. 嵌套的 if 的基本语法
在现实中,很少会只根据单一标准来做决策。通常需要同时检查多个条件,而且它们往往彼此相关。比如,想去看演唱会,不仅要成年——有时还需要在邀请名单上。这就需要所谓的多层逻辑,而嵌套的 if 正好能帮助我们实现它。
所谓嵌套条件,就是一个 if 放在另一个 if 的内部。可以把它想象成盒中套盒:只有当外层条件满足时,才会检查内层条件。这是一个强大的控制流程工具。
从简单的开始:
if (conditionA)
{
// 当 conditionA 为 true(真)时的操作
if (conditionB)
{
// 当两个条件都为真时的操作
}
}
if 内部嵌套另一个
if
如果这让你想起了套娃——那你理解得很正确!内层的 if 只有在外层触发时才会执行。
示例:进入俱乐部
让我们扩展一下之前的教学小程序,用户先前输入过姓名和年龄。现在增加第二层检查:假设要进入私密俱乐部,既要年满 21 岁,并且还要有邀请码。
System.out.print("请输入您的姓名:");
String name = console.nextLine();
System.out.print("请输入您的年龄:");
int age = console.nextInt();
if (age >= 21)
{
System.out.print("请输入邀请码:");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("欢迎你," + name + ",来到 VIP 俱乐部!");
}
else
{
System.out.println("抱歉,邀请码不正确。禁止访问。");
}
}
else
{
System.out.println("抱歉,21 岁起方可入场!");
}
请注意:内层的 if 只有在年龄已通过检查时才会验证邀请码。这既节省资源(也节省保安的耐心)。
2. 可以嵌套多少层?
从技术上讲——想要多少层都可以。但在实践中:嵌套层级越多,代码就越难读、越难维护。通常会尽量限制在 2–3 层。如果出现了 4 层以上的“梯子式” if,不妨想想能否简化逻辑,或把检查提取到方法中。
3. 嵌套 if 与 else:陷阱与细节
新手常见错误:随意省略花括号。
在 Java 中使用 else 时有一条硬规则:如果没有花括号 {},那么 if 或 else 之后只有第一条语句会被包含进去。这是造成恼人 bug 的常见源头。
可能出错的示例:
if (age >= 21)
if (code.equals("VIP2024"))
System.out.println("欢迎!");
else
System.out.println("邀请码不正确。");
很多人会以为这个 else 对应的是年龄检查,但实际上它对应的是离它最近的 if(也就是邀请码检查)。因此输出的消息可能与预期不符。最好始终使用花括号——即使其中只有一行代码!
为避免误解,编译器实际“看到”的结构是这样的:
if (age >= 21)
{
if (code.equals("VIP2024"))
System.out.println("欢迎!");
else
System.out.println("邀请码不正确。");
}
重要!再强调一次:在 if-else 结构中,如果没有加花括号,else 会绑定到它前面最近的那个 if。
4. 替代方案:在嵌套条件中使用 else if
有时在外层 if 内,我们不仅想检查一个附加条件,还希望提供备选方案。比如,如果邀请码不匹配,可以给出访客模式或直接拒绝。
if (age >= 21)
{
System.out.print("请输入邀请码:");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("欢迎来到俱乐部!");
}
else if (code.equals("GUEST"))
{
System.out.println("访客模式:仅可进入至 23:00。");
}
else
{
System.out.println("很遗憾,无法提供访问。");
}
}
else
{
System.out.println("21 岁起方可入场。");
}
这里在外层选择中,我们对三种场景进行了嵌套选择:VIP 码、访客码与拒绝。
5. 实战:使用多层逻辑的折扣计算器
根据用户的年龄以及是否拥有会员卡来计算折扣。
- 如果用户年龄大于或等于 60 —— 折扣 15%。
- 如果年龄更小,但用户有会员卡 —— 折扣 7%。
- 其他情况则没有折扣。
如何实现?
System.out.print("请输入您的年龄:");
int age = console.nextInt();
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
System.out.print("您是否有会员卡(是/否)?");
String hasCard = console.nextLine();
if (hasCard.equals("是"))
{
discount = 0.07;
}
}
System.out.println("您的折扣:" + (discount * 100) + "%");
这里我们在 else 分支中使用了嵌套的 if:当年龄不满足时,才去询问会员卡。
GO TO FULL VERSION