if-thenif-then-else语句不同,switch语句可以具有许多可能的执行路径。switch适用于byteshortcharint基本数据类型。它还适用于枚举类型枚举类型中讨论), String类,以及一些些基本类型的包装类: CharacterByteShort,和 Integer数字和字符串中讨论)。
以下代码示例 SwitchDemo声明了一个int类型,名为month的字段,其值表示月份。以下代码使用switch语句基于month的值,显示月份的名称。

  1. public class SwitchDemo {
  2. public static void main(String[] args) {
  3. int month = 8;
  4. String monthString;
  5. switch (month) {
  6. case 1: monthString = "January";
  7. break;
  8. case 2: monthString = "February";
  9. break;
  10. case 3: monthString = "March";
  11. break;
  12. case 4: monthString = "April";
  13. break;
  14. case 5: monthString = "May";
  15. break;
  16. case 6: monthString = "June";
  17. break;
  18. case 7: monthString = "July";
  19. break;
  20. case 8: monthString = "August";
  21. break;
  22. case 9: monthString = "September";
  23. break;
  24. case 10: monthString = "October";
  25. break;
  26. case 11: monthString = "November";
  27. break;
  28. case 12: monthString = "December";
  29. break;
  30. default: monthString = "Invalid month";
  31. break;
  32. }
  33. System.out.println(monthString);
  34. }
  35. }

在这种情况下,August将打印到标准输出。
switch语句的主体称为switch块switch块中的语句可以用一个或多个casedefault标签来标记。switch语句计算其表达式,然后执行匹配case标签后的所有语句。
您还可以使用以下if-then-else语句显示月份名称:

  1. int month = 8;
  2. if (month == 1) {
  3. System.out.println("January");
  4. } else if (month == 2) {
  5. System.out.println("February");
  6. }
  7. ... // and so on

根据测试的表达式的可读性来决定是使用if-then-else语句,还是使用switch语句。一条if-then-else语句可以基于值或条件的范围来测试表达式,而一条switch语句只能基于单个整数,枚举值或String对象来测试表达式。
另一个重点是break语句。每个break语句都终止该封闭的switch语句。控制流继续执行switch块之后的第一条语句。break语句是必需的,因为没有它们,switch块中的语句会陷入:匹配case标签之后的所有语句并将按顺序执行,而不管后续case标签的表达如何,直到遇到一条break语句为止。该程序 SwitchDemoFallThroughswitch块的形式显示语句。程序显示与整数month相对应的月份,以及该年份之后的月份:

  1. public class SwitchDemoFallThrough {
  2. public static void main(String[] args) {
  3. java.util.ArrayList<String> futureMonths =
  4. new java.util.ArrayList<String>();
  5. int month = 8;
  6. switch (month) {
  7. case 1: futureMonths.add("January");
  8. case 2: futureMonths.add("February");
  9. case 3: futureMonths.add("March");
  10. case 4: futureMonths.add("April");
  11. case 5: futureMonths.add("May");
  12. case 6: futureMonths.add("June");
  13. case 7: futureMonths.add("July");
  14. case 8: futureMonths.add("August");
  15. case 9: futureMonths.add("September");
  16. case 10: futureMonths.add("October");
  17. case 11: futureMonths.add("November");
  18. case 12: futureMonths.add("December");
  19. break;
  20. default: break;
  21. }
  22. if (futureMonths.isEmpty()) {
  23. System.out.println("Invalid month number");
  24. } else {
  25. for (String monthName : futureMonths) {
  26. System.out.println(monthName);
  27. }
  28. }
  29. }
  30. }

这是代码的输出:

  1. August
  2. September
  3. October
  4. November
  5. December

从技术上讲,由于控制流不在该switch语句之内,因此不需要最终的break。建议使用break,这样可以更轻松地修改代码,并且不易出错。default语句处理所有未由其中一个case语句明确处理的值。
以下代码示例 SwitchDemo2显示了语句可以具有多个case标签。该代码示例计算特定月份中的天数:

  1. class SwitchDemo2 {
  2. public static void main(String[] args) {
  3. int month = 2;
  4. int year = 2000;
  5. int numDays = 0;
  6. switch (month) {
  7. case 1: case 3: case 5:
  8. case 7: case 8: case 10:
  9. case 12:
  10. numDays = 31;
  11. break;
  12. case 4: case 6:
  13. case 9: case 11:
  14. numDays = 30;
  15. break;
  16. case 2:
  17. if (((year % 4 == 0) &&
  18. !(year % 100 == 0))
  19. || (year % 400 == 0))
  20. numDays = 29;
  21. else
  22. numDays = 28;
  23. break;
  24. default:
  25. System.out.println("Invalid month.");
  26. break;
  27. }
  28. System.out.println("Number of Days = "
  29. + numDays);
  30. }
  31. }

这是代码的输出:

  1. Number of Days = 29

在switch语句中使用字符串

在Java SE 7和更高版本中,可以在switch语句的表达式中使用String对象。以下代码示例, StringSwitchDemo基于String类型,名为month的值显示月份数:

  1. public class StringSwitchDemo {
  2. public static int getMonthNumber(String month) {
  3. int monthNumber = 0;
  4. if (month == null) {
  5. return monthNumber;
  6. }
  7. switch (month.toLowerCase()) {
  8. case "january":
  9. monthNumber = 1;
  10. break;
  11. case "february":
  12. monthNumber = 2;
  13. break;
  14. case "march":
  15. monthNumber = 3;
  16. break;
  17. case "april":
  18. monthNumber = 4;
  19. break;
  20. case "may":
  21. monthNumber = 5;
  22. break;
  23. case "june":
  24. monthNumber = 6;
  25. break;
  26. case "july":
  27. monthNumber = 7;
  28. break;
  29. case "august":
  30. monthNumber = 8;
  31. break;
  32. case "september":
  33. monthNumber = 9;
  34. break;
  35. case "october":
  36. monthNumber = 10;
  37. break;
  38. case "november":
  39. monthNumber = 11;
  40. break;
  41. case "december":
  42. monthNumber = 12;
  43. break;
  44. default:
  45. monthNumber = 0;
  46. break;
  47. }
  48. return monthNumber;
  49. }
  50. public static void main(String[] args) {
  51. String month = "August";
  52. int returnedMonthNumber =
  53. StringSwitchDemo.getMonthNumber(month);
  54. if (returnedMonthNumber == 0) {
  55. System.out.println("Invalid month");
  56. } else {
  57. System.out.println(returnedMonthNumber);
  58. }
  59. }
  60. }

此代码的输出为8

将表达式中的switch表达式和与每个case标签关联的String进行比较,就好像使用String.equals方法一样。为了使StringSwitchDemo示例无论大小写都可以接受任何月份,将month转换为小写(使用 toLowerCase方法),并且与case标签关联的所有字符串都小写。
注意:此示例检查了switch语句中的表达式是否为null。确保任何switch语句中的表达式都不为空,以防止NullPointerException异常。