switch能作用在byte上,不能作用在long上,从Java7开始可以作用在String上。
本题考察的是switch知识。
switch语句用于多分支选择,在使用switch(expr)时,expr只能时一个枚举常量(内部也是由整形或字符类型实现)或一个整数表达式,
其中,整数表达式可以是基本数据类型int或其对应的包装类Integer,当然也包括不同的长度整形.例如short。由于byte,short和char都能够
被隐式地转换为int类型,因此,这些类型以及它们对应的包装类都可以作为switch的表达式。但是,long,float,double及String类型由于不能够
隐式地转换为int类型,因此,它们不能被用作switch的表达式。如果一定要使用long,float或double作为switch的参数,必须将其强制转换为
int型才可以。
另外,与switch对应的是case语句,case语句之后可以是直接的常量数值,例如1,2也可以是一个常量计算式,例如1+2等,还可以是final型的变量
(final变量必须是编译时的常量),例如final int a = 0,但不能是变量或带有变量的表达式,例如i*2等。当然,更不能是浮点型数,例如1.1或者1.2/2等。
随着Java语言的发展,在Java7中,switch开始支持String类型了。
从本质上讲,switch对字符串的支持,其实是int类型值的匹配。它的实现原理如下:通过对case后面的String对象调用hashCode()方法,
得到一个int类型的Hash值,然后用这个Hash值来唯一标识着这个case。那么当匹配的时候,首先会调用这个字符串hashCode()方法,获取一个Hash
值(int类型),用这个Hash值来匹配所有的case,如果没有匹配成功,说名不存在;如果匹配成功了,接着会调用字符串的String.equals()方法进行匹配。
由此可以看出,String变量不能为null,同时,switch的case字句中使用的字符串也不能为null。