除了使用简单if和多重if之外,还可以将整个if块插入另一个if块中,这种结构称为嵌套if。嵌套if主要用于只有当前提条件满足时,才判断后续条件是否满足。例如一个活动计划的安排:如果今天是工作日,则去上班,如果今天是周末,则外出游玩;同时,如果周末天气晴朗,则去室外游乐场游玩,否则去室内游乐场游玩。
嵌套if结构的语法如下:
if(<前提条件>)
{
if(<后续条件1>)
<语句块1>
else
<语句块2>
}
else
<语句块3>在编写嵌套if结构时,有时会引发一些疑问,下面是一个例子:
if( x > 0 ) if( y > 1 ) z=1; else /*这个else部分属于哪个if?*/ z=2;
按条件语句的语法形式,上面的例子似乎有两种可能的解释,第一种理解:外层的if是一个没有else部分的条件语句,最后的else部分属于内层的if语句;第二种理解:内层if是一个不带else部分的条件语句,最后的else属于外层的if条件语句。
为了避免这种二义性,Java语言规定,每个else部分总是属于前面最近的那个缺少对应的else部分if语句。根据这一规定,上面的例子第一种解释是正确的,第二种解释是不正确的。
因此,在编写代码时,尽量把嵌入的if语句块用“{”和“}”括起来,避免发生理解上的二义性。如果我们真的需要写出具有第二种意义的嵌套条件语句,那么,就应该采用下面的写法:
if( x > 0 )
{
if( y > 1 )
z=1;
}
else /*这个else部分属于哪个if?*/
z=2;案例1:编写一个程序,要求用户输入两个数值,通过嵌套if结构判断两个数值的大小,并输出相应信息。
在PbaseUnit10项目unit包下创建EmbedSample类。代码如下:
/**
* @Title: EmbedSample.java
* @Package unit
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package unit;
import java.util.Scanner;
/**
* @ClassName: EmbedSample
* @Description: 流程控制(嵌套if结构)案例1
* @author 编程训练营
* @date
*
*/
public class EmbedSample {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
*
* @return void 返回类型 @throws
*/
public static void main(String[] args) {
int num1, num2;
// 声明Scanner类,接收用户输入的两个数值
Scanner sc = new Scanner(System.in);
// 提示用户输入两个整数
System.out.println("请输入两个整数数:");
// Scanner类方法nextInt获取int类型的输入
num1 = sc.nextInt();
num2 = sc.nextInt();
// 用嵌套if结构判断两个数值的大小
// 首先判断num1和num2是否相等
if (num1 != num2) {
if (num1 > num2) {
System.out.printf("num1(%d)>num2(%d)", num1, num2);
} else {
System.out.printf("num1(%d)<num2(%d)", num1, num2);
}
} else
System.out.printf("num1(%d)=num2(%d)", num1, num2);
}
}程序结构分析
程序功能主要是演示嵌套if结构的使用。
采用嵌套结构实质上是为了进行多分支选择,判断两个数值的大小实际上有三种选择,即num1=num2、num1<num2或num1>num2,这种问题用if-else-if结构也可以完成,而且程序更加清晰。因此,在一般情况下,较少使用if的嵌套结构,以使程序更便于阅读和理解。
程序执行结果如下图所示:

从上述结果可以看出,输入相同或不同的两个数值,程序能够正确判断两个数值的大小。
在编写代码时,如果要使用嵌套if结构,尽量把嵌入的if语句块用“{”和“}”括起来,一方面可以提高代码的可理解性和易读性;另一方面也可以预防因if和else匹配错误,使程序发生不可预知的结果,增加程序调试难度。