switch表达式后面的数据类型只能是byte,short,char,int四种整形类型,枚举类型和java.lang.String类型(从java 7才允许),不能是boolean类型。

在网上看到好多文章,说switch还支持byte,short,char,int 的包装类,首先可以肯定说switch不支持这些包装类,但是如下的代码又是正确的:

    public static void main(String[] args) {
switch (new Integer(45)) {
case 40:
System.out.println("40");
break;
case 45:
System.out.println("45");//将会打印这句
break;
default:
System.out.println("?");
break;
}
}

可以打印正确的结果,在挨着挨着试完Byte,Short,Character,Integer后发现都可以正确打印,于是便说switch也支持byte,short,char,int的包装类。这种说法不完全正确,之所以switch能够支持他们的包装类,是因为自动拆箱(从JDK1.5开始支持自动拆箱和自动装箱,自动拆箱就是自动将引用数据类型转化为基本数据类型,自动装箱就是自动将基本数据类型转化为引用数据类型)的原因,下面使用jclasslib软件打开上面的.class文件,

 0 new #2 <java/lang/Integer>                             创建一个Integer类的对象
3 dup 将对象的标识压入栈顶部
4 bipush 45 将整形45压入栈中
6 invokespecial #3 <java/lang/Integer.<init>> 调用Integer类型的构造方法
9 invokervirtual #4 <java/lang/Integer.intValue> 调用intValue()方法
12 lookupswitch 2
40:40(+28)
45:51(+39)
defalut:62(+50)
40 getstatic #5 <java/lang/System.out> 获得标准输出流
43 ldc #6 <40> 从常量池中将40的索引压入栈中
45 invokevirtual #7 <java/io/PrintStream.println> 调用println()方法
48 goto 70 (+22)
51 gestatic #5 <java/lang/System.out>
54 ldc #8 <45>
56 invokevirtual #7 <java/io/PrintStream.println>
59 goto 70 (+11)
62 getstatic #5 <java/lang/System.out>
65 ldc #9<?>
67 invokevirtual #7 <java/io/PrintStream.println>
70 return

从上面的第5行我们可以看出编译器自动调用了intValue()方法,如果是使用Byte会自动调用byteValue()方法,如果是Short会自动调用shortValue()方法,如果是Integer会自动调用intValue()方法。switch 的查找原理是使用key-offset在目标表格中查找的,lookupswitch后面的数字和goto后面的数字都是有规律的,关于更多信息可以查看The Java® Virtual Machine Specification

因此switch表达式后面的数据类型只支持byte,short,int整形类型、字符类型char、枚举类型和java.lang.String类型。

本文为博主原创作品,转载请注明出处。

最新文章

  1. hadoop配置
  2. Floyd_Warshall POJ 3660 Cow Contest
  3. Android View.onMeasure方法的理解
  4. apue第七章学习总结
  5. 33条C#、.Net经典面试题目及答案
  6. 1401 - Remember the Word
  7. js中对arry数组的各种操作小结
  8. Ubuntu 14.04 忘记用户密码(备忘)
  9. VS2015 Cordova Ionic移动开发(一)
  10. SRM 581 D2 L2:SurveillanceSystem,重叠度
  11. H3C S5120交换机ACL应用的问题
  12. 阅读&amp;lt;反欺骗的艺术&amp;gt;思考
  13. Training little cats poj3735
  14. Python 安装包的导入
  15. 详细QRCode生成二维码和下载实现案例
  16. table2excel使用
  17. django2+uwsgi+nginx上线部署到服务器Ubuntu16.04(最新最详细版)
  18. RegExp 对象
  19. 64位JDK+tomcat6+myeclipse 10安装与配置
  20. 100-days:nine

热门文章

  1. WIN7系统开题提示loli.vbs 操作超时怎么办
  2. javascript 替换 window.onload 的 document.ready
  3. .net 关于匿名类型的特性
  4. 获取js连接参数js_args
  5. 解决IE6兼容性问题的十一大技巧
  6. ZH奶酪:Git简明教程
  7. Binary Search二分法搜索C++程序
  8. 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题
  9. Git如何获得两个版本间所有变更的文件列表
  10. js Object.create 初探