流程控制语句
顺序结构语句
- jvm调用main方法:代码从上而下依次加载(源顺序)
选择结构语句
- if语句
- switch语句
循环结构语句
- while语句
- do...while语句
- for循环语句
选择结构
if语句
三种格式
/* 针对单一条件进行判断 执行流程: 首先判断表达式是否成立, 如果成立,则执行语句; 否则不成立,不会执行! */ if(表达式){ 语句; }
/* 执行流程: 首先判断表达式是否成立, 如果成立,执行语句1; 否则,执行语句2 */ if(表达式){ 语句1; }else{ 语句2; }
/* 场景:针对多个情况进行判断 流程: 首先,判断表达式1是否成立,成立,执行语句1 否则,判断表达式2是否成立,成立,执行语句2 否则,判断表达式3是否成立,成立,执行语句3 .... 如果上述都没有匹配的结果:执行else的语句; */ if(表达式1){ 语句1; }else if(表达式2){ 语句2; }else if(表达式3){ 语句3; ...... }else{ 语句n+1; }
注意事项:
- if的后面不能有;if(表达式);{} 错误语法 ;有左大括号的地方不能有分号;有分号的地方不能有左大括号
- 如果使用if格式1,里面的语句是条语句,{}是可以省略的!,不建议省略!
switch语句
switch语句格式:
/* 执行流程首先计算出表达式的值其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程 中,遇到break就会结束。最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。 */ switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; … default: 语句体n+1; break; }
表达式的数据类型:
- jdk5之前:最基本的类型:int,byte,char
- jdk5以后:可以跟枚举类(enum)
- jdk7以后:String类型
注意事项:
- case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
- default可以省略吗?可以省略。一般不建议。除非判断的值是固定的。(单选题)
- break可以省略吗?可以省略,一般不建议。否则结果可能不是你想要的
- default的位置一定要在最后吗?可以出现在switch语句任意位置。
- switch语句的结束条件: 遇到break 或者 执行到程序的末尾
case的穿透效果
/* 在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。 */ public static void main(String[] args) { int i = 5; switch (i){ case 0: System.out.println("执行case0"); break; case 5: System.out.println("执行case5"); case 10: System.out.println("执行case10"); default: System.out.println("执行default"); } }
执行结果
将default放到中间的穿透效果
class Test{ public static void main(String[] args) { int i = 5; switch (i){ case 0: System.out.println("执行case0"); break; case 5: System.out.println("执行case5"); default: System.out.println("执行default"); case 10: System.out.println("执行case10"); } } }
执行结果
结论:当case的值表达式的值匹配时没有遇到break就会发生穿透效果,这种情况只需看下方还有哪些执行语句即可
if语句和switch语句的区别
if语句使用场景:
- 针对结果是boolean类型的判断
- 针对一个范围的判断
switch语句使用场景:
- 针对几个常量值的判断
循环语句
for循环
语句格式
for(初始化表达式①; 布尔表达式②; 步进表达式④){ 循环体③ }
执行流程
- 执行顺序:①②③④>②③④>②③④…②不满足为止。
- ①负责完成循环变量初始化
- ②负责判断是否满足循环条件,不满足则跳出循环
- ③具体执行的语句
- ④循环后,循环条件所涉及变量的变化情况
注意事项:
判断条件语句的结果是一个boolean类型循环体语句如果是一条语句,大括号可以省略; 如果是多条语句,大括号不能省略。建议永远不要省略。 一般来说:有左大括号就没有分号,有分号就没有左大括号
for循环死循环格式:
for(;;){ System.out.print("死循环"); }
while循环
语句格式
/* while循环语句格式: 基本格式 */ while(判断条件语句) { 循环体语句; } /* 扩展格式 */ 初始化语句; while(判断条件语句) { 循环体语句; 控制条件语句; }
执行流程:
while循环死循环:
while(true){ System.out.println("死循环"); }
for循环和while循环的区别
for循环语句和while循环语句可以等价转换,但还是有些小区别的使用区别:
- 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
- 当明确循环次数建议使用for循环,不明确建议使用while
do...while循环
/* do…while循环语句格式: 基本格式 */ do { 循环体语句; }while((判断条件语句); /* 扩展格式 */ 初始化语句; do { 循环体语句; 控制条件语句; } while((判断条件语句);
执行流程:
do...while循环的特点:
无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。这样的循环具有一定的风险性。
跳出语句
break
使用场景:终止switch或者循环
- 在选择结构switch语句中
- 在循环语句中
- 离开使用场景的存在是没有意义的
break的作用:
- 跳出单层循环
- 跳出多层循环
- 带标签的跳出 格式:标签名: 循环语句
例如:带标签的跳出
跳出外层:
class TestDemo{ public static void main(String[] args){ //定义外层标签wc wc:for(int i = 0 ; i < 4 ; i++){ //定义内层标签nc nc:for(int y = 0 ; y < 4 ; y++){ if(i==1){ //跳出外层 break wc; } System.out.print("*"); } } } }
运行结果:跳出外层结束循环
跳出内层:
class TestDemo{ public static void main(String[] args){ //定义外层标签wc wc:for(int i = 0 ; i < 2 ; i++){ //定义内层标签nc nc:for(int y = 0 ; y < 2 ; y++){ if(i==1){ //跳出内层 break nc; } System.out.print("*"); } System.out.println(); } } }
运行结果:跳过内层直接进入外层下一次循环
continue
使用场景:结束本次循环,继续下一次的循环
public static void main(String[] args) { for (int i = 1; i <= 10; i++) { //需求:不打印第三次HelloWorld if(i == 3){ continue; } System.out.println("HelloWorld"+i); } }
运行结果:
return
Return关键字不是为了跳转出循环体,更常用的功能是结束一个方法,也就是退出一个方法。跳转到上层调用的方法。结束循环其实是结束了main方法
for(int x=0; x<10; x++) { if(x == 3) { System.out.println("退出"); //使用return结束main方法 return; } System.out.println(x); } System.out.println("over");
运行结果:没有输出”over“
Systm.exit(0)
直接结束jvm可以达到相同效果
class TestDemo{ public static void main(String[] args) { for(int x=0; x<10; x++) { if(x == 3) { System.out.println("退出"); System.exit(0); //return; } System.out.println(x); } System.out.println("over"); } }
运行结果: