3、流程控制
在所有编程语言中都会有三种基础的流程结构
- 顺序结构
- 选择结构
- 循环结构
流程结构可以控制作用于内代码的执行流程。这个作用域在Java中称为 块
。块就是程序中用 {} 括起来的若干Java语句。块可以互相嵌套,嵌套的代码块中不能存在同名的变量
class Block {
{
}
}
3.1、顺序结构
这是所有语言中最常见的结构,正常情况下java的代码都是按照语法从上到下的顺序执行,中间没有任何判断和跳转。
3.2、选择结构
选择结构主要用来进行判断,它能根据不同的条件选择不同的执行方案。适合于带有逻辑或关系比较等条件判断的计算。
在Java中选择结构有两种实现方式
- if、elese 语句
- switch 语句
3.2.1、if else
if 语句是告诉程序在满足某种条件时需要执行的语句,它通过布尔表达式来确定一段代码是否要执行。
-
简单的if条件语句
if(布尔表达式){ //代码块 如果布尔表达式结果为true则执行内部代码,否则不执行 }
-
if…else语句:条件为真时执行一个代码块,否则执行另一个代码块。
if(布尔表达式){ //代码块 如果布尔表达式结果为true则执行此代码 }else{ //代码块 如果布尔表达式结果为false则执行此代码 }
-
多分支语:用于处理更复杂的条件。
if(布尔表达式){ //代码块 如果布尔表达式结果为true则执行内部代码 }else if(布尔表达式){ //else if可以重复书写,多条件判断 //代码块 如果布尔表达式结果为true则执行内部代码 }else{ //else必须放在最后 //代码块 如果以上条件都不满足则执行此代码 }
如果是多条件的话,要注意条件的先后顺序:
1、如果所有的条件没有交集,可以不考虑顺序
2、如果条件之间有交集的话,需要根据情况调整先后顺序
3、如果条件之间有包含的关系,则应该将范围小的放在上面
3.2.2、switch
switch也是一种选择语句,当一个表达式有多个选项时,使用switch比使用if 更简洁易懂。switch语句是判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。一般和case、default一起使用
语法规则:
- switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
- case 语句中的值的数据类型必须与变量的数据类型相同
- 当case后的值和表达式的值匹配后,开始执行,直到遇到break后,switch才会结束,否则程序会继续执行下一条 case 语句,直到出现 break 语句。
- switch 语句可以包含一个 default 分支,一般放在最后。default 在没有 case 语句的值和变量值相等的时候执行。
switch(表达式){ //表达式类型:byte、short、int 、char、String 类型必须和case条件中value的类型相同
case value1: //如果变量的值 == value1 则执行此case内语句
//语句
break; //break代表switch结束
case value2: //如果变量的值 == value2 则执行此case内语句
//语句
break;
.....
default: //可选,以上case语句都不满足的情况下,执行default内语句
//语句
}
switch执行的几种情况:
-
switch语句会对case的条件进行匹配,case条件如果成立执行内部语句后,遇到break直接结束switch语句。
-
如果case没有匹配值则不会执行任何case语句,最后会执行default语句。
-
如果case有匹配值,但是没有break语句,程序执行当前匹配的case语句和后续所有的case语句,直到有break或switch结束
switch语句作用在整数上,而byte、short、char都可以隐含装换为int,所以这些数据类型是可以的,在JDK7.0版本中对switch做了功能的加强,可以接收String类型,所以String也是可以的,而long、浮点型数据不可以。
对于if elas和switch的选择:如果条件较少建议使用if语句(if语句使用起来更灵活,但是无法精准匹配,需要按顺序依次匹配条件)如果条件较多建议使用switch(可以精准匹配,直接执行匹配的case或default)
3.2.3、switch表达式
在Java12 中引入了 switch表达式作为预览特性,这是对传统 switch 语句的增强,它允许 switch 不仅仅作为语句使用,还可以作为表达式使用,从而可以有返回值。在 Java14 中,switch表达式成为了标准特性。
在 Java 12 之前,switch只能作为语句使用:
int day = 4;
String dayType;
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
dayType = "workday 工作日";
break;
case 6:
case 7:
dayType = "dayOff 休息日";
break;
default:
dayType = "Invalid day";
break;
}
System.out.println(dayType);
从 Java 12 开始,可以使用switch作为表达式,它允许直接返回一个值:
int day = 4;
String dayType = switch (day) {
case 1, 2, 3, 4, 5 - > "workday 工作日";
case 6, 7 - > "dayOff 休息日";
default - > "Invalid day";
};
System.out.println(dayType);
在 switch表达式中,可以使用 - >来代替 :,这样就不需要 break语句来阻止代码的进一步执行。每个 case分支都是一个表达式,并且自动包含了 break 语句。
如果 case 分支需要执行更复杂的逻辑,可以使用 yield 关键字来返回一个值:
int day = 4;
String dayType = switch (day) {
case 1, 2, 3, 4, 5 - > {
// 复杂的逻辑
yield "workday 工作日";
}
case 6, 7 -> {
// 复杂的逻辑
yield "dayOff 休息日";
}
default -> {
// 复杂的逻辑
yield "Invalid day";
}
};
System.out.println(dayType);
在这种情况下,yield用于从 switch表达式的 case块中返回一个值。
- switch表达式要求所有可能的情况都被覆盖,或者包含一个 default 分支。当使用 switch表达式时,如果没有匹配的 case并且没有 default分支,会抛出
java.lang.SwitchExpressionException
。 - 可以用于 int、byte、short、char、String、枚举类型以及从 Java SE 14 开始的 int 包装类和枚举类型的实例。
Java17不仅增加了新的switch的写法,还将原来的switch进行了改进,即便是 case:这种写法,也能支持表达式功能,但是它必须使用 yield 才能将值返回,而且yield 会直接跳出switch,所以使用了yield 后,就不需要break了。