除了使用简单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
z=2;示例1:编写一个程序,要求用户输入两个数值,通过嵌套if结构判断两个数值的大小,并输出相应信息。
在D盘Java目录下,新建“EmbedSample.java”文件。用记事本打开“EmbedSample.java”文件,输入以下代码:
import java.util.*;
public class EmbedSample
{
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的嵌套结构,以使程序更便于阅读和理解。
编译“EmbedSample.java”文件,在命令行窗口输入“javac EmbedSample.java”并执行命令,编译通过后,在命令行窗口输入“java EmbedSample”运行Java程序,命令行窗口显示如下信息:

图 7-4 if嵌套结构示例执行结果
从上述结果可以看出,输入相同或不同的两个数值,程序能够正确判断两个数值的大小。
■ 知识点拨
在编写代码时,如果要使用嵌套if结构,尽量把嵌入的if语句块用“{”和“}”括起来,一方面可以提高代码的可理解性和易读性;另一方面也可以预防因if和else匹配错误,使程序发生不可预知的结果,增加程序调试难度。
■ 思考与练习
编写一个程序,要求用嵌套if结构实现。提示用户输入用户名,然后再提示输入密码。如果用户名是"admin"并且密码是“888888”,则提示输入正确,否则提示输入错误。