【java】switch case支持的7种数据类型

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能够支持他们的包装类,是因为自动拆箱(就是自动将引用数据类型转化为基本数据类型)的原因,下面使用jclasslib软件打开上面的.class文件,

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

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

因此switch表达式后面的数据类型只能是byte,short,char,int四种整形类型,枚举类型和java.lang.String类型。

时间: 2024-10-08 06:24:12

【java】switch case支持的7种数据类型的相关文章

switch case 支持的 6 种数据类型!

有粉丝建议可以偶尔推送一些 Java 方面的基础知识,一方面可以帮助一初学者,也可以兼顾中高级的开发者. 那么今天就讲一下 Java 中的 switch case 语句吧,有忘记的同学正好可以温习一下. Java 中 switch case 语句用来判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有

Java-Runoob:Java switch case

ylbtech-Java-Runoob:Java switch case 1.返回顶部 1. Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch case 语句语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任意数量的case语句 default : //可选

Java switch case 语句

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断. class Test { public static void main(String args[]){ //char grade = args[0].charAt(0); char grade = 'C'; switch(grade) { case 'A' : S

Java switch case语句

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. switch(expression){//变量类型可以是byte,short,int,char,String case value://case标签后面必须是字符串常量或字面量 //代码语句,当case的值和变量的值相等时,会执行case里面的代码语句,直到break时跳出switch语句 break;//遇到break,switch语句终止,case语句不是必要跟着break,没有break出现,程序会执

java中的输入流(Scanner),数据类型,运算符,switch,数组的用法

//java中创建包用package相当于C#的命名空间namespace,java中导入包用import相当于C#中引入命名空间usingimport java.util.*;//导入包,*代表导入java.util包下面的所有类public class Test { /***********Scanner的使用************/// public static void main(String[] args) {//  Scanner input = new Scanner(Syst

Redis支持5种数据类型

Redis目前支持5种数据类型,分别是 String(字符串) List(列表) Hash(字典) Set(集合) Sorted Set(有序集合) Redis数据类型 1.字符串类型 SET key value                   设置key=value GET key                         或者键key对应的值 GETRANGE key start end          得到字符串的子字符串存放在一个键 GETSET key value    

java中的Switch case语句

java中的Switch case 语句 在Switch语句中有4个关键字:switch,case break,default. 在switch(变量),变量只能是整型或者字符型,程序先读出这个变量的值,然后在各个"case"里查找哪个值和这个变量相等,如果相等,则条件成立,程序执行相应的分支,直到碰上break或有switch语句结束. 有几个需要着重注意的地方. 第一,前面说了switch(变量),只能是整型和字符类型. 第二,case之后是直接的常量数值. 第三,break使得程

Java千百问_06数据结构(008)_null属于哪种数据类型

点击进入_更多_Java千百问 1.null属于哪种数据类型 首先,在java中,null本身不是对象,也不是Objcet的实例.那么他属于哪种数据类型呢? 了解数据类型看这里:java中数据类型是什么 java基本数据类型看这里:[java有哪8种基本数据类型3 具体看下面这个例子: if (null instanceof java.lang.Object) { System.out.println("null属于java.lang.Object类型"); } else { Syst

java中switch case和break使用

switch只能比较数值或字符或者类对象 首先看看switch的括号,当中放置您要取出数值的变量.取出数值之后,程序会开始与case中所设定的数字或字符做比较, 如果符合就执行其中的语句,直到遇到break后离开switch程序块:如果没有符合的数值或字符,则会执行default后的语句, default不一定需要:如果没有默认要处理的动作,可以省去这个部分 实例如下: @Test public void switchCase(){ this.net(2); } private void net