分支语句是根据一定的条件从程序的多个分支中选择一个或几个来执行。Java中的分支语句分为四种:if语句、if-else语句、if-else if语句和switch语句。
1. if语句
if语句是单分支控制语句,其语法格式如下:
if(表达式){ 语句块 } |
在if语句中,关键字if后面一对小括号“(”和“)”内的表达式的值必须为布尔类型,当表达式的取值为true时,则执行一对花括号“{”和“}”内的语句块,当表达式的取值为false时,执行第二个花括号后面的语句。如果语句块只有一条语句,则可以省略一对花括号“{”和“}。If语句的流程图如图1所示。
图1. if语句结构
【例1】 从控制台输入两个整数m和n,如果m等于n,输出字符串“m is equal to n.”。
代码如下:
import java.util.Scanner;
public class IFDemo {
public static void main(String[] args) {
int m=0,n=0; //声量两个整数变量
System.out.println("Input integer m and n: ");
Scanner in=new Scanner(System.in);//创建Scanner对象
m=in.nextInt(); //键盘输入的整数赋给m
n=in.nextInt(); //键盘输入的整数赋给n
if(m==n) { //如果m等于n
System.out.println("m is equal to n.");
}
in.close();
}
}
Java并不直接支持从控制台输入,但可以使用Scanner类创建对象,以读取来自System.in的输入,System.in表示标准输入设备。在上面的程序中,首先创建一个Scanner对象in,然后调用对象in的nextInt()方法来读取用户从键盘上输入的int型数据。也可以调用对象in的方法nextByte()、nextShort()、nextLong()、nextFloat()、nextDouble()、nextLine()读取用户在键盘上输入的相应类的字节型、短整型、长整型、单精度浮点型、双算精度浮点型和字符串型数据。nextXXX()方法被调用后,则等待用户从键盘上输入数据并按Enter键、空格键或Tab键盘确认。
2. if-else语句
if-else语句是双分支控制语句,其语法格式如下:
if(表达式){ 语句块1 }else{ 语句块2 } |
在if-else语句中,关键字if后面一对括号“(”和“)”内的表达式的值必须为布尔类型,当表达式的取值为true时,执行语句块1,否则,执行语句块2。if-else语句的程序控制结构如图2所示。
图2. if-else语句结构
【例2】 从控制台输入两个整数m和n,输出它们之间的最大者。
代码如下:
import java.util.Scanner;
public class IFELSEDemo {
public static void main(String[] args) {
int m,n; //声量两个整数变量
Scanner in=new Scanner(System.in);//创建Scanner对象
System.out.println("Input integer m and n: ");
m=in.nextInt(); //键盘输入的整数赋给m
n=in.nextInt(); //键盘输入的整数赋给n
if(m>=n) { //如果m等于等于n
System.out.println("最大值为:"+m);
}else { //如果m小于n
System.out.println("最大值为:"+n);
}
in.close();
}
}
3. if-else-if语句
if-else if语句是多分支控制语句,可以根据多个条件来控制程序执行流程,其语法格式如下:
if(表达式1){ 语句块1 }else if(表达式2){ 语句块2 } … else if(表达式n){ 语句块n } [else{ 语句块n+1 }] |
在if-else if语句中,if以及多个else if后面的一对括号“(”和“)”内的表达式的值必须为布尔类型。在程序执行时,首先计算表达式1的值,如果表达式1的值为true,则执行语句块1,否则,计算表达式2的值,如果表达式2的值为true,则执行语句块2,依此类推,最后计算表达式n的值,如果表达式n的值为true,则执行语句块n,否则,执行语句块n+1。if-else if语句中的else部分是可选项,如果没有else部分,当所有表达式都为false时,结束当前if-else if语句的执行。if-else if语句的程序控制结构如图3所示。
图3. if-else-if语句结构
【例3】 用if-else if语句实现符号函数功能,整数的符号为1,负数的符号为-1,0的符号为0。
代码如下:
public class IFELSEIFDemo {
public static int sign(double x) {
int y;
if(x>0) {//如果x大于0
y=1;
}else if(x==0) {//如果x等于0
y=0;
}else {//如果x小于0
y=-1;
}
return y;
}
public static void main(String[] args) {
System.out.println("10的符号为:"+sign(10));
System.out.println("0的符号为:"+sign(0));
System.out.println("-10的符号为:"+sign(-10));
}
}
4. switch语句
switch语句是单条件多分支程序控制语句,其语句的语法格式如下:
switch(表达式){ case 常量值1: 语句块1 [break;] case 常量值2: 语句块2 [break;] … case 常量值n: 语句块n [break;] [default: 语句块n+1 ] } |
在switch语句中,关键字switch后面的一对括号“(”和“)”内的表达式的值必须为byte、short、int、char或枚举类型,各个case关键字后面的常量也必须是byte、short、int、char或枚举类型常量,而且要互不相同。在执行switch语句时,首先计算表达式的取值,如果表达式的值和某个case后面的常量值相等,就执行该case里面的语句块直到碰到break语句为止。如果某个case中没有使用break语句,一旦表达式的值和该case后面的常量值相等,程序不仅执行该case里的语句块,而且继续执行后继case里面的语句块,直到碰到break语句为止。如果switch语句中的表达式的值不与任何case后面的常量值相等,则执行default后面的语句块n+1。switch语句中的default是可选部分,如果它不存在,并且表达式的值不与任何case后面的常量相等,那么switch语句就不会进行任何处理。switch语句的程序控制结构如图4所示。
图4. switch语句结构
【例4】 编写一个程序,输入月份和年份,输出该月份的天数。我们知道,1、3、5、7、8、10、12月份的天数为31天;4、6、9、11的月份为30天;闰年的2月份为29天,非闰年的2月份为28天,如果一个年份能被4整除且不能被100整除,或者不能400整除,那么这个年份为闰年,否则为非闰年。
代码如下:
public class SwitchDemo {
public static int isLeapyear(int year,int month) {
int day=0;
switch(month) {
//如果month的值为1、3、5、7、8、10、12
case 1:case 3:case 5:case 7:
case 8:case 10:case 12:
day=31;
break;
//如果month的值为4、6、9、11
case 4:case 6:case 9:case 11:
day=30;
break;
//如果month的值为2
case 2:
//如果year为闰年
if((year%4==0 && year%100!=0) || year%400==0)
day=29; //如果只有一条语句,可以省略{}
else//如果year为非闰年
day=28;
break;
default://如果month的值小于1或大于12
day=-1;
}
return day;
}
public static void main(String[] args) {
System.out.println("2021年1月的天数:"+isLeapyear(2021,1));
System.out.println("2021年2月的天数:"+isLeapyear(2021,2));
System.out.println("2021年4月的天数:"+isLeapyear(2021,4));
System.out.println("2024年2月的天数:"+isLeapyear(2024,2));
}
}