java支持的数据类型有哪些_java switch支持的数据类型有哪些?

本文详细解析了Java中switch表达式如何支持byte,short,char,int的包装类,通过分析.class文件发现,这实际上是由于自动拆箱机制导致的。编译器在处理switch时会调用相应类型的value()方法,如intValue(),实现对包装类型的转换。这一现象在JDK1.5引入自动拆箱与装箱后变得可能。
摘要由CSDN通过智能技术生成

182d9efb473a203b1315a4ab086d4b23.png

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 创建一个Integer类的对象

3 dup 将对象的标识压入栈顶部

4 bipush 45 将整形45压入栈中

6 invokespecial #3 > 调用Integer类型的构造方法

9 invokervirtual #4 调用intValue()方法

12 lookupswitch 2

40:40(+28)

45:51(+39)

defalut:62(+50)

40 getstatic #5 获得标准输出流

43 ldc #6 <40> 从常量池中将40的索引压入栈中

45 invokevirtual #7 调用println()方法

48 goto 70 (+22)

51 gestatic #5

54 ldc #8 <45>

56 invokevirtual #7

59 goto 70 (+11)

62 getstatic #5

65 ldc #9>

67 invokevirtual #7

70 return

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值