switch表达式后面的数据类型只能是byte,short,char,int四种整型类型,枚举类型和java.lang.String类型(从java 7才允许),不能是boolean,long,float,double类型。
在网上看到好多文章,说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后面的数字都是有规律的。
因此switch表达式后面的数据类型只支持byte,short,int整形类型、字符类型char、枚举类型和java.lang.String类型。
以上就是java switch支持的数据类型有哪些?的详细内容,更多请关注易知道|edz.cc其它相关文章!