文章目录
Java 流程控制
Java 中分为三种基本的流程控制结构:
顺序结构
、分支结构
、循环结构
顺序结构: 从上而下顺序执行每一行代码(默认结构)
分支结构: 根据条件来选择性地执行某段代码
循环结构: 根据循环条件重复执行某段代码。
一、顺序结构
顺序结构: 从上而下顺序执行每一行代码。顺序结构就是程序从上到下逐行地执行,中间没有任何判断和跳转。
二、分支结构
分支结构: 包含
if
、else
、switch
,根据条件来选择性地执行某段代码
if…else…
单分支:if
如果表达式为 true 执行语句体, 否者不执行。
if(关系表达式){ 语句体; }
双分支:if…else
如果 表达式为 true 执行 语句体1,如果为 false 就执行 语句体2。
if(关系表达式) { 语句体1; }else { 语句体2; }
多分支:if…else if…else
首先判断 关系表达式1 看其结果是
true
还是false
。
如果是true
就执行 语句体1,然后结束当前分支
如果是false
就继续向下执行判断,都为false
,最终执行else
if (关系表达式1) { 执行语句1; } else if (关系表达式2) { 执行语句2; } ... }else if (关系表达式n) { 执行语句n; } else { 执行语句n+1; }
分支嵌套:if…else 嵌套
分支嵌套 就是在
if
的语句块中,或者是在else
语句块中,又包含了另外一个条件判断(可以是单分支、双分支、多分支)public static void main(String[] args) { int score = 89; if(score < 0 || score > 100){ System.out.println("你的成绩是错误的"); }else{ if(score >= 90){ System.out.println("你的成绩属于优秀"); }else if(score >= 80){ System.out.println("你的成绩属于好"); }else if(score >= 60){ System.out.println("你的成绩属于及格"); }else { System.out.println("你的成绩属于不及格"); } } }
switch
语法格式:
switch(表达式) 的值的类型,只能是:4种基本数据类型(
byte
,short
,char
,int
);两种引用数据类型(JDK1.5 之后枚举
、JDK1.7 之后String
)case 后面必须是常量值,而且不能重复
switch(表达式){ case 常量值1: 语句块1; break; case 常量值2: 语句块2; break; ... default: 默认语句块; break; }
执行过程:
一旦从
入口
进入,就会顺序往下执行,直到遇到出口
,中途可能发生 贯穿入口: ①.表达式 的值与
case
后面的某个常量值匹配,就从这个case
进入;②. 没有找到就寻找default
分支进入; 不管default
在哪里。
出口: ①. switch 执行到最后退出 ②. 遇到了break
退出
两种分支语句的区别
if else: 是一条比较指令,通过判断每一个条件,执行对应的分支。
switch: 是一张地址表,只需访问对应索引号的表项就能定位分支,所以 switch 效率较高。if else: 语句的条件是一个布尔类型值。通常根据某个判断结果进入分支,使用范围更广。
switch: 语句的条件是一个常量值。条件是几个固定的常量值,使用 switch 语句。
三、循环语句
循环语句: 包含
for
、while
、do...while
,可以在满足循环条件的情况下,反复执行某一段代码。
for 循环
语法格式:
for(初始化语句①; 循环条件语句②; 迭代语句④){ 循环体语句③ } for(;;){ 循环体语句块;//如果循环体中没有跳出循环体的语句,那么就是死循环 }
注意:
(1)for ( ; ; ) 中的 两个
;
是不能多也不能少
(2)循环条件必须是boolean
类型
(3)如果循环条件语句②省略的话,就默认为循环条件成立执行流程
- 执行 初始化语句①,完成循环变量的初始化
- 执行循环条件语句②,看循环条件语句的值是
true
,还是false
;
2.1 如果是true
,执行第三步
2.2 如果是false
,循环语句中止,循环不再执行 - 执行循环体语句③
- 执行迭代语句④,针对循环变量重新赋值
- 根据循环变量的新值,重新从第二步开始再执行一遍
案例
打印10次的HelloWorld
public class Test{ public static void main(String[] args){ for(int i = 0; i < 10; i++){ System.out.println("Hello, World!!!"); } } }
while 循环
语法格式
while (循环条件语句①) { 循环体语句②; } while(true){ 循环体语句;//如果此时循环体中没有跳出循环的语句,也是死循环 }
执行流程
- 执行 循环条件语句①,看循环条件语句的值是
true
,还是false
1.1 如果是true
,执行第二步
1.2 如果是false
,循环语句中止,循环不再执行 - 第二步:执行循环体语句②
- 第三步:循环体语句执行完后,重新从第一步开始再执行一遍
- 执行 循环条件语句①,看循环条件语句的值是
案例
打印10次的HelloWorld
public class Test{ public static void main(String[] args){ int i = 0; while(i < 10){ System.out.println("Hello, World!!!"); i++; } } }
do…while 循环
do…while 结构的循环体语句至少会执行一次
语法格式:
do { 循环体语句①; } while (循环条件语句②);
执行流程
- 执行循环体语句①;
- 执行循环条件语句②,看循环条件语句的值是
true
,还是false
;
2.1 如果是true
,执行第三步;
2.2 如果是false
,循环语句终止,循环不再执行。 - 循环条件语句执行完后,重新从第一步开始再执行一遍
案例
打印10次的HelloWorld
public class Test{ public static void main(String[] args){ int i = 0; do{ System.out.println("Hello, World!!!"); i++; }while(i < 10); } }
三种循环语句的区别
一、从循环次数角度分析
do…while 循环 至少执行一次循环体语句
for 和 while 循环 先循环条件语句是否成立,然后决定是否执行循环体,可能一次也不执行。
二、从循环变量的生命周期角度分析
- for 循环 的循环变量在
for()
中声明的,在循环语句结束后,变量不可以被访问; - while 和 do…while 循环的循环变量因为在外面声明的,所以
while
和do...while
结束后可以被继续使用的
三、如何选择
- 遍历有明显的循环次数(范围)的需求,选择 for 循环
- 遍历没有明显的循环次数(范围)的需求,选择 while 循环
- 如果循环体语句块至少执行一次,选择 do…while循环
- 本质上:三种循环之间是可以互相转换的
嵌套循环
嵌套循环: 是指一个循环的循环体是另一个循环。比如
for循环
里面还有一个for循环
,就是嵌套循环
。
三种循环可以任意互相嵌套。
语法格式:
for(初始化语句①; 循环条件语句②; 迭代语句⑦) { for(初始化语句③; 循环条件语句④; 迭代语句⑥) { 循环体语句⑤; } }
案例:
public class Test01 { public static void main(String[] args) { // 打印出下面的图形 /* * ** *** **** */ // 外层循环控制行数 for (int i = 0; i < 4; i++) { // 1. 内层循环第一次执行: j = 0 i = 0 打印一次 * // 2. 外层循环执行一次, i++, 然后 j 重新赋值 0; 0 <= 1 打印两次 * // 3. 外层最后一次循环 i=3 然后内层循环 0 <= 3 也就是四次 * // 4. i++ 外层(4 < 4) 条件不成立, 跳出循环 for (int j = 0; j <= i; j++) { System.out.print('*'); } System.out.println(); } } }
运行结果:
* ** *** ****
四、break 和 continue 关键字
break
break 关键字 在
switch
或循环语句
中使用
switch
中表示跳出 switch 分支语句
循环语句
中表示跳出最近的一次循环语句
案例
public class Test02 { public static void main(String[] args) { // 输出 1-10 的数字, 如果数字为6, 结束循环 for (int i = 1; i <= 10; i++) { if(i == 6){ System.out.print("我是" + i +", 到我就结束了"); break; } System.out.print("数字" + (i) + " "); } } }
运行结果:
数字1 数字2 数字3 数字4 数字5 我是6, 到我就结束了
continue
continue 只能在循环语句中使用,表示跳出
本次循环体
, 进行下次循环
- 案例
运行结果public class Test03 { public static void main(String[] args) { // 输出 1-10 的数字, 但是不输出 6 for (int i = 1; i <= 10; i++) { if(i == 6){ continue; } System.out.print("数字" + (i) + " "); } } }
数字1 数字2 数字3 数字4 数字5 数字7 数字8 数字9 数字10