1 流程控制结构分类
- 顺序结构:是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
- 选择(分支)结构:选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。
- 循环结构:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。也称之为迭代。
2 顺序结构
3 选择结构
3.1 if语句
if 、 if else 、 if else if……else
3.1.1 if
if(关系表达式){
语句体;
}
图解:
- 关系表达式的类型,必须是boolean 类型。
- 执行顺序:判断表达式的值:true,执行语句体;false,语句体不执行。
注意:当if后的语句块中,只有一条语句的时候,{} 可以省略。但建议不省略。
3.1.2 if else
if(关系表达式) {
语句体1;
}else {
语句体2;
}
图解:
- 关系表达式的类型必须是boolean。
- 关系表达式的值true,执行语句1;返回的是false,执行语句2;
- if语句第二种格式和三元运算符
三元运算符的操作都可以使用if语句改进,反之不成立。什么时候不成立呢?
当if语句控制的语句体是一条输出语句的时候,就不成立。因为三元运算符是一个运算符,必须要求有一个结果返回。而输出语句却不能作为一个返回结果。
3.1.3 if … else if … else
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}
… …
else {
语句体n+1;
}
图解:
- 表达式的类型必须是boolean。
- 判断表达式1的值,true,执行语句1;false,继续判断其他的表达式。表达式成立,执行对应的语句体。都不成立,执行else中的语句体n+1。
注意:使用if语句,先处理包含范围更小的情况,会使代码更加简单。
3.2 switch 语句
switch(表达式){
case 常量标号(值) : 语句;
break;
case 常量标号 : 语句;
break;
case 常量标号 : 语句;
break;
case 常量标号 : 语句;
break;
case 常量标号 : 语句;
break;
case 常量标号 : 语句;
break;
default : 语句;
(break;)
}
图解:
解释:
- 表达式的类型:byte、short、int、char,JDK1.5支持enum枚举,以及他们的包装类,在JDK1.7及以上支持String类型,不能是Long类型、boolean类型、浮点型、StringBuilder和StringBuffer类。
- 常量标号(值):类型必须和表达式的类型相同或者是相兼容。只能是常量,不能是变量,而且,多个case后面的值不能出现相同的。
- break:用于退出语句,执行完后程序结束,不再向下执行。可省略,但不建议
- default:标签可以不作为最后的语句,甚至可以作为第一个语句,但是任然最后匹配。可省略,但不建议,因为它可以作为排除所以正常情况之外的意外情况的解释。
执行顺序:
- 若每一层都加入break关键字:
① 首先计算表达式的值。
② 表达式的值和常量标号匹配,匹配成功,执行相应的语句。
③ 都匹配不到,执行default。 - 若不加break关键字:(case穿透)
表达式匹配到case相等的标号之后,程序便开始执行该case标签之后的所有代码,并且不再判断与后面的case、default标签是否匹配,除非遇到break或者到结尾才会结束。
注意
在switch语句中,表达式的值不能是null,否则会在运行时抛出NullPointerException。在case子句中也不能使用null,否则会出现编译错误。
case字句的值是不能重复的。对于字符串类型的也一样,但是字符串中可以包含Unicode转义字符。重复值的检查是在Java编译器对Java源代码进行相关的词法转换之后才进行的。也就是说,有些case字句的值虽然在源代码中看起来是不同的,但是经词法转换之后是一样的,就会在成编译错误。比如:“男”和“\u7537”就是一个意思。
3.3 If和switch的使用场景
if语句使用场景:
针对结果是boolean类型的判断
针对一个范围的判断
针对几个常量值的判断
switch语句使用场景:
针对几个常量值的判断
4 循环结构
For 、 while 、 do while循环 、 增强for循环
4.1 循环语句的组成
- 初始化语句:一条或者多条语句,这些语句完成一些初始化操作。
- 判断条件语句:这是一个boolean 表达式,这个表达式能决定是否执行循环体。
- 循环体语句:这个部分是循环体语句,也就是我们要多次做的事情。
- 控制条件语句:这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条件中的变量,使得循环在合适的时候结束。也称为迭代语句。
4.2 for循环
for(初始化语句;判断条件语句;控制条件语句) {
循环体语句; }
图解:
执行顺序:
A:执行初始化语句 B:执行判断条件语句,看其结果是true还是false 如果是false,循环结束。 如果是true,继续执行。
C:执行循环体语句 D:执行控制条件语句 E:回到B继续…………
注意:
循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略括号。
4.3 while循环
基本格式
while(判断条件语句) {
循环体语句;
}
扩展格式
初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
图解:
解释:
表达式的类型必须是boolean类型。如果表达式的值true,执行循环体。循环体执行完成后,继续判断表达式的值。值还是true,继续执行循环体。当表达式的值false,循环结束。
4.3.1 while的结束条件
- 在循环体当中定义使表达式趋于false的式子。
- 在while循环体当中可以定义break关键字。结束break关键字所在的循环。
- return。但是return表示结束整个方法,return所在的循环和之后的语句都不会执行了,所以慎用。
- System.exit(int status)方法,会结束整个线程,慎用。Main方法中return和exit效果是一样的。
4.4 do while
基本格式
do {
循环体语句;
}while((判断条件语句);
扩展格式
初始化语句;
do {
循环体语句;
控制条件语句;
} while((判断条件语句);
图解:
判断条件语句:结果是一个boolean类型的值。
执行顺序:先执行do当中的内容,再去判断表达式的值。为true,继续执行do,为false,结束。
特点:表达式至少被执行一次。
4.5 while循环和for循环的使用时机
- 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
- 当明确循环次数,有限循环此属使用for循环。
- 不明确循环次数的前提下,只能使用while循环。
- 如果要使用无限循环,使用while。
4.5.1 三种循环结构的区别及注意事项
三种循环语句其实都可以完成一样的功能,也就是说可以等价转换,但还是有小区别的:
do…while循环至少会执行一次循环体。for循环和while循环只有在条件成立的时候才会去执行循环体
注意:无限循环下面不允许再定义代码语句,编译会直接报错。
5 跳转控制关键字
Java中的goto是保留字,目前不能使用。虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,比如说,我想在某个循环知道到某一步的时候就结束,现在就做不了这件事情。为了弥补这个缺陷,Java就提供了break,continue和return来实现控制语句的跳转和中断。
break 中断
continue 继续
return 返回
5.1 break关键字
应用场景:
- 用在switch case条件语句当中,表示switch语句的结束,此时外层如有循环语句,则循环语句不受此break影响。
- 用在循环语句当中:
① 能够用在循环当中,表示跳出break关键字所在的层的循环。
② break标签
语法:
标签名称: for/while(){
break 标签名称;
}
表示跳出(结束)标签所定义的循环。break在除了上面的场景之外的其他场景中使用无意义。
5.2 continue关键字
continue:只能用在循环语句当中,其他场景中使用无意义。
使用方式:
- 直接使用continue关键字:
结束本次循环(结束continue语句所在循环下面未完成的部分),继续下次循环。 - continue标签;
语法同break标签,但是意义不同。表示结束continue标签所在的循环的本次循环,继续下次循环。
5.3 return关键字
return关键字不是为了跳转出循环体,更常用的功能是结束一个方法,也就是退出一个方法。跳转到上层调用的方法。
无返回值的方法当中:
在方法的末尾,默认存在return关键字(包括构造方法).
作用:表示方法的结束。
注意:return表示方法的结束,在return后边不能再有任何的语句,否则编译会报错。
在有返回值的方法当中:
作用一:
将方法运算后的结果返回。返回结果的类型必须和方法声明处的类型相同或者是兼容。
作用二:
return表示方法的结束,在return后边不能再有任何的语句。