A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张利星 中级黑马   /  2014-1-13 20:41  /  1854 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张利星 于 2014-1-15 21:28 编辑

switch 语句中case后的常量表达式的类型需要一致吗?与switch后括号中表达式的类型之间应该保持什么样的关系,下面这个程序为什么没错误呢?
  1. class FenZhi {
  2.         public static void main(String[] args) {
  3.                 byte x = 2;
  4.                 final int y = 2;
  5.                 switch(x) {
  6.                         case 1 :
  7.                                 System.out.println(11);
  8.                                 break;
  9.                         case 'a' :
  10.                                 System.out.println(22);
  11.                                 break;
  12.                         case y :
  13.                                 System.out.println(33);
  14.                                 break;
  15.                         case 3+2 :
  16.                                 System.out.println(44);
  17.                                 break;
  18.                         default:
  19.                                 System.out.println("no");
  20.                 }
  21.         }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

8 个回复

倒序浏览
本帖最后由 xu6148152 于 2014-1-13 21:00 编辑

JAVA支持的数据类型有五种
他们分别是:
byte、char、short、int、枚举
以上是JDK1.6以前的版本。JDK1.7时,又增加了String,所以相对于JDK1.7而言就是六种了
因此语法上并不用完全统一。编译不会出错。当你这段程序执行时,结果会打印33。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你这样是可以的,但是实际应用的时候都是类型都是一样的,所以你也就别这么写,养成好习惯很重要。
回复 使用道具 举报
JDK1.6时,java中switch支持的数据类型:byte、char、short、int、枚举。
JDK1.7时,又增加了String。
因此 switch(x) 中x的类型可以是 byte、char、short、int、枚举、String。。
case后边跟的是满足条件,所以必须是一个常量,或者常量表达式,意思就是必须跟一个唯一值。只有当条件满足这个唯一值得时候才会执行满足条件的代码,如果不满足会继续下一个case,直到找到满足的条件,如果都不满足就执行default。
----------------------------------
            switch(x) {
                    case 1 :  //整型常量1
                            System.out.println(11);
                            break;
                    case 'a' :  //'a'是字符常量,'a'在ascii表中对应的数字是97。所以这里‘a’就相当于整型常量97
                            System.out.println(22);
                            break;
                    case y :   //y为整型常量2
                            System.out.println(33);
                            break;
                    case 3+2 :  //3+2是一个常量表达式=5
                            System.out.println(44);
                            break;
                    default:
                            System.out.println("no");
            }
所以这个程序没问题。
-------------------
如果case后跟的不是常量,编译会不通过。
比如把你这个程序修改下
把final int y = 2;改为int y = 2;
编译就不会通过。因为修改后y不再是常量了,此时y是变量。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 很给力!

查看全部评分

回复 使用道具 举报
孤独的天奇 发表于 2014-1-13 21:06
你这样是可以的,但是实际应用的时候都是类型都是一样的,所以你也就别这么写,养成好习惯很重要。 ...

嗯,这个我知道,可是当case后出现String类型时,就不能跟int,short,char,byte这些混合使用了,因为编译不通过,所以我奇怪怎么混合符合语法,怎么混合会编译失败,这里边有没有什么道理可循
回复 使用道具 举报
淡夜清风 发表于 2014-1-13 21:21
JDK1.6时,java中switch支持的数据类型:byte、char、short、int、枚举。
JDK1.7时,又增加了String。
因此 ...

可是如果case中有String类型的常量,就不能像这样几种不同类型的常量混着用了,那是为什么呢?是因为自动类型提升吗(byte、short、char、int都有可以用整数常量赋值的时候)?
回复 使用道具 举报
xu6148152 发表于 2014-1-13 20:57
JAVA支持的数据类型有五种
他们分别是:
byte、char、short、int、枚举

string类型就不能跟其它类型混用(编译不通过),枚举没试过行不行,我想知道这是为什么,有的能混,有的不能混,有没有什么规则
回复 使用道具 举报
张利星 发表于 2014-1-14 12:33
string类型就不能跟其它类型混用(编译不通过),枚举没试过行不行,我想知道这是为什么,有的能混,有的 ...

String常量是字符串常量,不能转换成byte、char、short、int、枚举等类型。
所以switch和case里面都应该是String常量。
byte、char、short、int、枚举等类型可以相互转换。。
例子:
public class FenZhi {
    public static void main(String[] args) {

            final String s="abc";
            switch(s) {
                    case "abv" :
                            System.out.println(11);
                            break;
                    case "abc" :
                            System.out.println(22);
                            break;
                    case "cde" :
                            System.out.println(33);
                            break;
                    case "efg" :
                            System.out.println(44);
                            break;
                    default:
                            System.out.println("no");
            }
    }
}
最后输出结果:22
回复 使用道具 举报
那你就把你的jdk版本升级到1.7 ,可以向下兼容   ——————————你的头型看着让人心悸。猛一看.......
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马