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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 柳小龙 中级黑马   /  2013-8-14 22:14  /  2506 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?


15 个回复

倒序浏览
看张老师的面试宝典
回复 使用道具 举报
在李刚的疯狂java讲义书中有这样一句话    switch括号中只能放能转换成int类型的值....所以String是不行的
回复 使用道具 举报 0 1
本帖最后由 penpen 于 2013-8-14 23:42 编辑

刚看了下官方文档是可以的。http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html。
这个应该是JDK7新增加的功能。
回复 使用道具 举报
测了一下。
  1. public class swictchDemo {

  2.         public static void main(String[] args) {

  3.                 Scanner in1=new Scanner(System.in);
  4.                
  5.                 String c=in1.next();//int byte
  6.                
  7.                 switch (c)
  8.                 {
  9.                 case "s":
  10.                         System.out.println("s"+"Ok.");
  11.                         break;
  12.                 case "d":
  13.                         System.out.println("d"+"Ok.");
  14.                         break;
  15.                                
  16.                 default:
  17.                         break;
  18.                 }
  19.                 /*---------------------------------------------------------------------*/
  20.                
  21.                 Scanner in2=new Scanner(System.in);
  22.                
  23.                 int n=in2.nextInt();
  24.                
  25.                 switch (n)
  26.                 {
  27.                 case 1:
  28.                         System.out.println("1,ok");
  29.                         break;
  30.                 case 2:
  31.                         System.out.println("2,ok");
  32.                         break;
  33.                 default:
  34.                         break;
  35.                 }
  36.                 /*------------------------------------------------------------------------*/
  37.                 Scanner in3=new Scanner(System.in);
  38.                
  39.                 byte b=in3.nextByte();
  40.                
  41.                 try {
  42.                         switch (b) {//java.util.InputMismatchException
  43.                         case 'a':
  44.                                 System.out.println('a'+",ok.");
  45.                                 break;
  46.                         case 'b':
  47.                                 System.out.println('b'+",ok.");
  48.                                 break;
  49.                         default:
  50.                                 break;
  51.                         }
  52.                 } catch (Exception e) {
  53.                         // TODO Auto-generated catch block
  54.                         //throw InputMismatchException(e);//e.printStackTrace();
  55.                         //e.initCause();//InputMismatchException
  56.                 }
  57.                
  58.                
  59.                
  60.                
  61.                
  62.                
  63.         }

  64. }
复制代码
只有int String类型可以,long byte不行。
回复 使用道具 举报
新版的JDK7中有对这个switch改进,是支持的。

Unlike if-then and if-then-else statements, the switch statement can have a number of possible execution paths. A switch works with the byte, short, char, and int primitive data types. It also works with enumerated types (discussed in Enum Types), the String class, and a few special classes that wrap certain primitive types: Character, Byte, Short, and Integer (discussed in Numbers and Strings).

这个是jdk 7官方说明文档提到的。
回复 使用道具 举报
毕老师的视频中有讲到这个问题。简单的测试一下就行了吧。(注:我的是7.0版本的jdk)
  1. public class SwitchDemo {
  2.         public static void main(String[] args) {

  3.                                 byte a = '+';
  4.                                 long b = 5l;
  5.                                 String c = "is";

  6.                 //测试byte类型
  7.                 switch (a)
  8.                 {
  9.                 case '-':
  10.                         System.out.println("输出减号");
  11.                         break;
  12.                 case '+':
  13.                         System.out.println("输出加号");
  14.                         break;
  15.                                 
  16.                 default:
  17.                         break;
  18.                 }
  19.                
  20.                 //测试long类型
  21.                 switch (b)
  22.                 {
  23.                 case 0l:
  24.                         System.out.println("输出0l");
  25.                         break;
  26.                 case 5l:
  27.                         System.out.println("输出5l");
  28.                         break;
  29.                 default:
  30.                         break;
  31.                 }

  32.                                 //测试String类型
  33.                 switch (c)
  34.                 {
  35.                 case "is":
  36.                         System.out.println("输出is");
  37.                         break;
  38.                 case "be":
  39.                         System.out.println("输出be");
  40.                         break;
  41.                                 
  42.                 default:
  43.                         break;
  44.                 }            
  45.         }
  46. }
复制代码
编译报错如下:
SwitchDemo.java:25: 错误: 可能损失精度
                switch (b)
                        ^
  需要: int
  找到:    long
1 个错误


也就是说,可以是byte和String,但不能是long。注释掉long这一截之后,运行结果如下:
输出加号
输出is


事实上,java中规定,switch语句只兼容能够转成int类型的数据类型,也就是int,byte,short,char。
java5.0以后的版本增加了对于enum(枚举)类型的支持,以及以上四种类型的包装类。
java7.0以后的版本增加了对于String类型的支持。
回复 使用道具 举报 1 0
本帖最后由 dongliangcp 于 2013-8-15 06:52 编辑

switch只能作用在byte short char int  这四个整数类型和枚举类型上  当然String 上也是可以的(这个是JAVA7新加入的  不过只能是java.lang.String)
回复 使用道具 举报
本帖最后由 EYE_SEE_YOU 于 2013-8-15 14:00 编辑

这些基础你都没做笔记的嘛,
看我的,switch(常量表达式)
目前最新版本,
它的常量表达式可以是
1.数值型:byte,short,char,int
2.枚举
3.字符串
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
其实我觉得这句话有语病,主语跟宾语反了吧,不要这些细节

回复 使用道具 举报
答案这么丰富,谢谢各位。。
回复 使用道具 举报
swtich作用在int上面,如果是byte的话,可以自动提升为int,所以也可以,不能作用在long上面,long不能自动转成int,在JDK7.0中,可以作用在字符串String上面
回复 使用道具 举报
a767175432 发表于 2013-8-14 23:34
在李刚的疯狂java讲义书中有这样一句话    switch括号中只能放能转换成int类型的值....所以String是不行的 ...

简直是扯谈,1.7新特性支持String,谁说STRING不能放SWITCH
回复 使用道具 举报
肥猫 发表于 2013-8-15 20:29
简直是扯谈,1.7新特性支持String,谁说STRING不能放SWITCH

java 1.6(包括)以前,只是支持等价成int 基本类型的数据:byte ,short,char,int(其他的都不可以)。
1.7加入的新特性可以支持String类型的数据。追问long不可以吗?回答不可以的。。就算你通过强制的转化也必须是转成int。




你说的也没错 但是我看得是第一版的 是1.6好吗???   在1.7出来之前是扯淡吗??  
回复 使用道具 举报
kmter 中级黑马 2013-8-15 23:56:16
14#
a767175432 发表于 2013-8-15 21:47
java 1.6(包括)以前,只是支持等价成int 基本类型的数据:byte ,short,char,int(其他的都不可以)。
1.7加 ...

我看的书也是1.6版本的, 但毕竟1.7已经出来有一段时间了, 我记得上次你和我说过你自学了java1.7的所有新特性, 可能还没有完全适应吧?
技术是不断更新迭代的, 这次算是亲身感受了一下
回复 使用道具 举报
a767175432 发表于 2013-8-14 23:34
在李刚的疯狂java讲义书中有这样一句话    switch括号中只能放能转换成int类型的值....所以String是不行的 ...

在JDK7.0中加入了String 在JDK7.0中可以
回复 使用道具 举报
witch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马