摘要
很长时间没有更新了,跟大家说声对不起,(我是不是不配拥有你们 ),得发点福利吧,现在已经2020年了首先呢,祝大家新年快乐! 上一期呢我们学的是分支语句里的if else else if ,今天呢我们继续来学分支语句!
1、switch
switch它的中文意思呢? 有开关的意思,选择的意思,分支的意思。 switch语句呢他是用来做一些排比式的判断,看一下语法:
语法:
switch(表达式){
case 取值1: 语句块1;
break;
case 取值n: 语句块n;
break;
default: 语句块n+1;
break;
}
switch语句有关规则
-
表达式的返回值必须是下述几种类型之一: int, byte, char, short,确定的结果,jdk1.7后支持String;
-
case子句中的取值必须是常量,且所有case子句中的取值应是不同的;
-
default子句是可选的;
-
break语句用来在执行完一个case分支后使程序跳出switch语句块; 如果case后面没有写break则直接往下面执行!
-
case后面的执行体可写{ }也可以不写{ }
switch与if嵌套
switch(表达式){
case 取值n: 语句块n;
if(表达式){…}
break;
default: 语句块n+1;
break;
}
练习题:
1、编写一程序实现如下功能: 输入1、2、3、4、5、6、7(分别对应星期一至星期日)中的任何一个数。
2、输入一个月数,然后输出对应月份有多少天(不考虑闰年),将天数输出。
3、直接用JDK1.7的字符串条件判断,确定两个数是执行加、减、乘、除操作。
练习题大家,一点要敲一敲,虽然很简单,但是多打打总是没有坏处的!
switch里可以嵌套if 也可以嵌套switch 都是可以的
然后说一下switch作用域的问题:
看这一段的代码
public class Test4{
public static void main(String[] args){
int a=2;
switch(a){
case 1:
int i=0;
System.out.println("i="+i);
break;
case 2:
int i=1;
System.out.println("i="+i);
break;
}
}
}
这样写会有什么错呢?
报错,报的是int i已经定义了,不能重新定义了,如果代码改成下边的样子会不会报错呢 ?
public class Test4{
public static void main(String[] args){
int a=2;
switch(a){
case 1:
int i=0;
System.out.println("i="+i);
break;
case 2:
i=1;
System.out.println("i="+i);
break;
}
}
i会不会输出出来呢? 下面就让我们看一下答案?
a 不是等于2吗? case 1: 这个分支不是没有执行吗,怎么会不报错呢? 这就和作用域有关系了,我们发现 int i=0,离它最近的一个大括号,是在switch后边,所以它在编译的时候,int i这个变量的作用域就是整个switch。 所以没有报错,case 里边是语句块,他可以加{}的,咱们加上试试:
public class Test4{
public static void main(String[] args){
int a=2;
switch(a){
case 1:{
int i=0;
System.out.println("i="+i);
}
break;
case 2:
i=1;
System.out.println("i="+i);
break;
}
}
}
运行后的 结果
报错的意思就是地11和12行的找不到这个变量,因为case里加了个大括号,所以int i=0; 它只在case里的大括号里能找到! 这也是个小坑吧! 工作和面试的时候大家注意点吧!
2、分支语句的比较:
if vs switch
相同点: 都是选择分支语句。
不同点:
-
语法不同。
-
语句后表达式值的类型不同,if语句表达式值的类型是boolean,swith分支表达式值的类型是byte,short,char,int,枚举,String。
-
适用场景
if: 变量的值在某个区间之内。
switch: 变量的值是某个定值。
Tip:
if分支判断的时候建议把,匹配率高的分支放在前边,这样会提高代码运行效率‘。
if判断时尽量使用确定值去跟不确定的值去判断
eg: int x=10;
if(15==x)
而不是 x==15,数值类型的时候这两个没啥区别,因为他有默认值,x默认=0,如果是引用类型的话,默认值有可能是个null,会出现最常见的空指针异常。 这样写的话会避免空指针异常
if vs 三目运算
三目运算符都可以使用if语句实现,反之不成立。
Java 7 switch支持String的实现原理:
这个新特性是在编译器这个层次上实现的,
java在运行的时候,分编译期和运行期,switch 编译之前是支持String的,编译后他就不支持String了,换了一种方式了。
在编译的过程中,编译器会根据源代码的含义进行转换 ,不同的Java编译器可能采用不同的方式来转换
比如: 如果switch语句中只包含一个case语句,那么就可以简单的将其转换成一个if语句。
如果包含一个case和一个default语句,就可以转换成if-else语句。 而对于复杂的情况(多个case语句), 也可以转换成Java 7 之前的switch语句,只不过使用字符串的哈希值(整数)作为switch语句表达式的值,哈希值是什么东西? 等学到了咱再说! 不要纠结!