switch语句

switch语法

switch (key) {
			case value:
				
				break;

			default:
				break;
			}

switch语句将从与选项值(上例子为key)匹配的case标签处开始执行直到遇到break语句,或执行到switch语句的结束处为止。如果没有相匹配的case标签,而有default子句,就执行这个子句。
与if和if-else语句不同,switch语句可以有许多可能的执行路径。switch可处理byte、short、char和int基本数据类型。它还适用于枚举类型、String类以及包装某些基本类型的一些特殊类:Character、Byte、Short和Integer。

public class SwitchDemo {
    public static void main(String[] args) {

        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break;
        }
        System.out.println(monthString);
    }
}
//输出为August

switch语句的主体称为switch块。switch块中的语句可以用一个或多个case标签或默认标签进行标记。switch语句对其表达式求值,然后执行匹配大小写标签后面的所有语句。
决定是否使用if-then-else语句或switch语句是基于可读性和语句所测试的表达式。if-then-else语句可以基于值或条件的范围测试表达式,而switch语句仅基于单个整数、枚举值或字符串对象测试表达式。
另一个有趣的地方是break语句。每个break语句都终止包含的switch语句。控制流继续执行开关块后面的第一个语句。break语句是必要的,因为没有break语句,switch块中的语句就会失效:匹配case标号之后的所有语句都按顺序执行,而不管后续case标号的表达式是什么,直到遇到break语句为止。

public class SwitchDemoFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
                     break;
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}
//此时输出为
August
September
October
November
December

上面就是switch的穿透,因为没有break,它会一条条执行下去,直至遇到break或 default语句

//穿透的一种利用
class SwitchDemo2 {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1: case 3: case 5:
            case 7: case 8: case 10:
            case 12:
                numDays = 31;
                break;
            case 4: case 6:
            case 9: case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值