Java switch的用法与case的穿透现象举例详解

switch和if-else的用法类似:

if(x == 3) {
			
}else if(x == 30) {
			
}else if(x == -6) {
			
}else {
			
}
等同于switch的:

switch(x) {
case 3:
	break;
case 30:
	break;
case -6:
	break;
default:
	
}

如果switch的case中不包含break,则即使运行了某个case中的代码,仍会检测其他case并一直运行到最后。

switch parameter的数据类型:

switch(int, short, byte, char, string){}

switch example: AgeCalculator.java

import javax.swing.JOptionPane;
import java.util.Calendar;

public class AgeCalculator {

	private static int daysSince_01_01_1900(int month, int date, int year) {
		int days = (int)((year - 1900) * 365.25);
		switch(month) {
		case 12:
			days += 30;
		case 11:
			days += 31;
		case 10:
			days += 30;
		case 9:
			days += 31;
		case 8:
			days += 31;
		case 7:
			days += 30;
		case 6:
			days += 31;
		case 5:
			days += 30;
		case 4:
			days += 31;
		case 3:
			days += (year % 4 == 0)?  29 : 28;
		case 2:
			days += 31;
		}
		days += date;
		return days;
	}
	
	public static void main(String[] args) {
	
		String birthday = JOptionPane.showInputDialog("Enter your birthday (MM/DD/YYYY): ");
		
		int birthMonth = Integer.parseInt(birthday.substring(0, 2));
		int birthDay = Integer.parseInt(birthday.substring(3, 5));
		int birthYear = Integer.parseInt(birthday.substring(6, 10));

		Calendar calendar = Calendar.getInstance();
		int todayMonth = calendar.get(Calendar.MONTH) + 1;   // returns 0 for January!
		int todayDay = calendar.get(Calendar.DAY_OF_MONTH);
		int todayYear = calendar.get(Calendar.YEAR);
		
		int todayDays = daysSince_01_01_1900(todayMonth, todayDay, todayYear);
		int birthdayDays = daysSince_01_01_1900(birthMonth, birthDay, birthYear);
		
		int ageDays = (todayDays - birthdayDays);
		System.out.println("You are " + ageDays + " days old.");
		System.out.println("That is " + ageDays * 24 * 60 * 60 + " seconds!");
	}

}
输入为:
02/27/1998
输出为:
You are 7244 days old.
That is 625881600 seconds!

switch中代码相同的case是可以归并的,类似于在if-else的Boolean中使用"||"。

example:
public class BetterSwitch {

		public static void main(String[] args) {
			
			String digitString = JOptionPane.showInputDialog("Enter a single digit.");
			int digit = Integer.parseInt(digitString);
			
			int mysteryValue = 0;
			
			switch(digit) {
			case 0:
			case 4:
			case 5:
			case 9:
				mysteryValue = 4;
				break;
			case 1:
			case 2:
			case 6:
				mysteryValue = 3;
				break;
			case 3:
			case 7:
			case 8:
				mysteryValue = 5;
				break;
			default:
				throw new RuntimeException("Illegal Value: " + digit);
			}
			System.out.println("Mystery value is " + mysteryValue);
		}
}
以上代码就等同于:
import javax.swing.JOptionPane;

public class PlainSwitch {

	public static void main(String[] args) {
		
		String digitString = JOptionPane.showInputDialog("Enter a single digit.");
		int digit = Integer.parseInt(digitString);
		
		int mysteryValue = 0;
		
		switch(digit) {
		case 0:
			mysteryValue = 4;
			break;
		case 1:
			mysteryValue = 3;
			break;
		case 2:
			mysteryValue = 3;
			break;
		case 3:
			mysteryValue = 5;
			break;
		case 4:
			mysteryValue = 4;
			break;
		case 5:
			mysteryValue = 4;
			break;
		case 6:
			mysteryValue = 3;
			break;
		case 7:
			mysteryValue = 5;
			break;
		case 8:
			mysteryValue = 5;
			break;
		case 9:
			mysteryValue = 4;
		default:
			throw new RuntimeException("Illegal value: " + digit);
		}
		System.out.println("Mystery value is " + mysteryValue);
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值