一、执行流程
所有case都和表达式的值不匹配,就会执行default语句体部分
从被匹配的位置开始执行,如果遇到break,那么退出选择结构
二、注意事项
1、case后面的常量值不能重复,不然编译器报错
2、switch后面的小括号只能存放特定类型的数据
- 基本数据类型:byte/short/char/int
- 引用数据类型:Byte、Short、Character、Integer、String字符串(1.7)、enum枚举1.5)
3、强烈建议,每个case和default语句体中写上break;语句
String userRole = "ADMIN";
switch (userRole) {
case "ADMIN":
System.out.println("管理员");
break;
case "USER":
System.out.println("普通用户");
break;
default: // default部分可选,检验不合理数据,增强程序健壮性
System.out.println("未知的角色");
break; // default语句体放在最后,该break可以省略,推荐不省略
}
三、练习理解
String str = "Java";
switch (str) {
case "C#":
System.out.println("C#");
default: // default语句体
System.out.println("C++");
case "Python":
System.out.println("Python");
}
四、与枚举类
switch在有限的可能值中选择,与枚举类是绝佳的组合
public class Demo {
public static void main(String[] args) {
OrderStatus status = OrderStatus.getStatusByCode(1);
switch (status) {
case PENDING_PAYMENT:
System.out.println("待付款");
break;
case PAID:
System.out.println("已付款");
break;
case SHIPPED:
System.out.println("已发货");
break;
case COMPLISH:
System.out.println("已完成");
break;
default:
System.out.println("未知的状态");
break;
}
}
enum OrderStatus {
PENDING_PAYMENT("待付款", 1),
PAID("已付款", 2),
SHIPPED("已发货", 3),
COMPLISH("已完成", 4); // 枚举对象必须放在枚举类的最前面
String status;
Integer code;
OrderStatus(String status, Integer code) {
this.status = status;
this.code = code;
}
public String getStatus() {
return status;
}
public Integer getCode() {
return code;
}
/**
* 根据code值获取枚举对象,静态方法
* 当枚举类与switch结合使用时,此方法是必须的
*
* @param code
* @return
*/
public static OrderStatus getStatusByCode(Integer code) {
// values()方法获取枚举对象数组
for (OrderStatus status : OrderStatus.values()) {
if (code == status.code) {
return status;
}
}
return null;
}
}
}