switch的穿透
在switch块中,每一个case都必须有一个break;否则,它会跑到下一个case或者下下一个case中去执行语句。
这就是switch中case的穿透。
之前觉得这样的设计简直鸡肋,直到发现了case穿透的好处:可以对多个匹配项统一处理甚至叠加处理,它让switch更灵活了。
统一地处理
有一群人 小红,小明,小兰,路人 。
来个有意思的处理: 小红和小明 吃肉;小兰吃面;路人喝汤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Main6 { public static void main(String[] args) { List<String> mem = new ArrayList<>(); mem.add("小红"); mem.add("小明"); mem.add("小兰"); mem.add("路人"); for(String m:mem) { System.out.print(m + ":"); switch(m){ case "小红": case "小明": System.out.print("吃肉"); break; case "小兰": System.out.print("吃面"); break; default: System.out.print("喝汤"); break; } System.out.println(); } } }
|

叠加地处理
有一群人 小红,小明,小兰,路人 。
来个有意思的处理: 路人喝水,小兰喝汤,小红喝汤吃面,小明喝汤吃面吃肉;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Main7 { public static void main(String[] args) { List<String> mem = new ArrayList<>(); mem.add("小明"); mem.add("小红"); mem.add("小兰"); mem.add("路人"); for(String m:mem) { System.out.print(m + ":"); switch(m){ case "小明": System.out.print("吃肉"); case "小红": System.out.print("吃面"); case "小兰": System.out.print("喝汤"); break; default: System.out.print("喝水"); break; } System.out.println(); } } }
|

注意事项:
- default一般写在最后,但是写在任意两个case之间或者是case之上也是没问题的,问题是不写在最后的default的break不能省略,否则也会有穿透效果。建议习惯是default的break一直要写。
- 多个case后面的数值不可以重复。
- switch后面小括号中只能是下列数据类型:
- 基本数据类型:byte/short/char/int
- 引用数据类型:String字符串(1.7+)、enum枚举
- break写或不写的穿透与否自己可以掌握,十分灵活。