发布日期:2013-03-06 13:32 来源:未知 标签: Java switch 规则
 

1、留意switch格式的写法

标准且合法的格式:

image

非法格式说明:

switch(x){

case 0 {}

}

switch(x){

0:{}

1:{}

}

能看到哪里错了吧,第一个没冒号,第二个没case关键字

2、switch表达式必须能被求值成char byte short int 或 enum

记忆的话可以记忆成非lang整形加枚举。请切记在java 6 及以前版本中string是不允许用在switch表达式中的(Java 7可以用string,现在正式版还没出来)

3、case常量必须是编译时常量,因为case的参数必须在编译时解析,也就是说必须是字面量或者是在声明时就赋值的final变量。

这个不太好理解,举个例子看看:

 public class Lesson06_5 { 

     public static void main(String[] args) { 

         final int a = 2; 

         final int b; 

         b = 3; 

         int x =2; 

         switch(x){ 

             case 1: //编译OK 

             case a: //编译OK 

             case b: //无法通过编译 

         } 

     } 

 }

编译一下看看:

image

4、case常量被会转换成switch表达式的类型,如果类型不匹配也会出错:

 public class Lesson06_5 { 

     public static void main(String[] args) { 

         byte x =2; 

         switch(x){ 

             case 1: //编译OK 

             case 128: //无法自动转换成byte,编译器会报错      } 

     } 

 }

image


5、多个case常量重复也会出错:

 public class Lesson06_5 { 

     public static void main(String[] args) { 

         byte x =2; 

         switch(x){ 

             case 1: //编译OK 

             case 1: 

         } 

     } 

 }

编译一下看看:

image

6、匹配的case的语句是入口而不是独立分支:

 public class Lesson06_5 { 

     public static void main(String[] args) { 

         int x = 1; 

         switch (x) { 

             case 1:System.out.println("周一"); 

             case 2:System.out.println("周二"); 

             case 3:System.out.println("周三"); 

             case 4:System.out.println("周四"); 

             case 5:System.out.println("周五"); 

             case 6:System.out.println("周六"); 

             case 7:System.out.println("周日"); 

             default:System.out.println("这个是星期几啊"); 

         } 

     } 

 }

image


switch代码是找到一个匹配的case常量入口,然后自顶向下执行的。也就是英文里的Fall-Through,你可以形象的理解他的执行方式是自由落体式的一股脑碰到啥就执行啥。

7、break:在switch语句块中,执行到break关键词时,立刻退出switch语句块,转到switch的下一条语句。

我们结合6、7两点规则来重写一次,判断月份天数的例子:

 public class Lesson06_3 { 

     public static void main(String[] args) { 

         int month = 9; 

         switch (month) { 

         case 1: 

         case 3: 

         case 5: 

         case 7: 

         case 8: 

         case 10: 

         case 12: 

             System.out.println(month + "月有31天"); 

             break; 

         case 2: 

             System.out.println(month + "月有28天"); 

             break; 

         case 4: 

         case 6: 

         case 9: 

         case 11: 

             System.out.println(month + "月有30天"); 

             break; 

         default: 

             System.out.println("没有这个月份吧"); 

             break; 

         } 

     } 

 }

运行程序:

image

8、default :当switch中所有的case常量都不匹配时,会执行default分支:

再把上面判断星期几的代码改一下:

 public class Lesson06_5 { 

     public static void main(String[] args) { 

         int x = 8; 

         switch (x) { 

             case 1:System.out.println("周一"); 

             default:System.out.println("这个是星期几啊"); 

             case 2:System.out.println("周二"); 

             case 3:System.out.println("周三"); 

             case 4:System.out.println("周四"); 

             case 5:System.out.println("周五"); 

             break; 

             case 6:System.out.println("周六"); 

             case 7:System.out.println("周日"); 

         } 

     } 

 }

运行程序:

image

我们故意写了星期8,所以触发了default分支,可是因为没有使用break语句,所以又直落执行了。于是出现了这个看起来有点奇怪,其实很正常的输出。

好了,到这里我们就把switch讲完了。大家要记住的是当程序中有很多需要判断的成点状数据需要分别处理时优先采用switch,如果遇到区间判断时,不用思考,还是用if-else吧。

 

相关评论

专题信息
    本教程的主要讲解java语言的核心基础知识,使读者能有个良好的语言基础,为以后进一步提高打下基础。宗旨是帮助更多想学习java的朋友快速入门,如果你是一个Java语言的初学者,那么就从Java教程,java数组,java环境变量配置,java网络编程,技巧等这里开始学习Java吧!