day07_Java中的流程控制(循环结构丶break丶continue)
循环概述
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
循环组成
- 初始化表达式:用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
- 循环条件:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
- 循环体:用于表示循环反复执行的内容,简单说就是循环反复执行的事情
- 步进表达式:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去
for循环
格式
执行流程
-
-
第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
-
如果是true,执行第三步;
-
如果是false,循环语句中止,循环不再执行。
-
-
第三步:执行循环体语句③
-
第四步:执行迭代语句④,针对循环变量重新赋值
-
图解分析:
注意事项:
- for(;;)中的两个;是不能多也不能少
- 循环条件必须是boolean类型
- 如果循环条件语句②省略的话,就默认为循环条件成立
代码示例
/* 需求: 在控制台输出所有的“水仙花数”及总个数 解释:什么是水仙花数? 水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数 例如 153 3*3*3 + 5*5*5 + 1*1*1 = 27 + 125 + 1 = 153 */ public class Demo03For { public static void main(String[] args) { //1.定义int变量count,初始值0,作用是统计水仙花数字的个数 int count = 0; //2.使用for循环遍历获取所有的三位数字,每个数字保存到int变量num中 for (int num = 100; num <= 999; num++) { //2.1计算num中数字的个位,十位,百位 分别保存到3个int变量ge(个位),shi(十位),bai(百位)中 int ge = num % 10;//个位 int shi = num / 10 % 10;//十位 int bai = num / 100 % 10;//百位 //2.2计算个位,十位,百位数字的立方和,保存到int变量sum中 //2.3判断如果三位数字num 等于 每位数字的立方和sum if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == num) { //输出该数字num System.out.println(num); //同时计数器count的值增加1 count++; } } //3.for循环结束后,打印count的值 System.out.println("水仙花数字总共有: " + count + " 个"); } }
while循环
格式:

执行流程:
-
第一步:执行初始化语句①,完成循环变量的初始化;
-
第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
-
如果是true,执行第三步;
-
如果是false,循环语句中止,循环不再执行。
-
-
第三步:执行循环体语句③
-
第四步:执行迭代语句④,针对循环变量重新赋值
-
第五步:根据循环变量的新值,重新从第二步开始再执行一遍
注意事项:
- while(循环条件)中循环条件必须是boolean类型
代码示例
package demo04; /* 需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度 是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度? */ public class Demo05While { public static void main(String[] args) { //定义一个计数器,初始值为0 int count = 0; //定义纸张厚度 double paper = 0.1; //定义珠穆朗玛峰的高度 int zf = 8844430; //因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环 // 折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度 while (paper <= zf) { //循环的执行过程中每次纸张折叠,纸张的厚度要加倍 paper *= 2; //在循环中执行累加,对应折叠了多少次 count++; } //打印计数器的值 System.out.println("需要折叠:" + count + "次");//需要折叠:27次 } }
注意事项:
- do{}while();最后有一个分号
执行流程:
-
第一步:执行初始化语句①,完成循环变量的初始化;
-
第二步:执行循环体语句②;
-
第三步:执行迭代语句③,针对循环变量重新赋值;
-
第四步:执行循环条件语句④,看循环条件语句的值是true,还是false;
-
如果是true,根据循环变量的新值,重新从第二步开始再执行一遍;
-
如果是false,循环语句中止,循环不再执行。
-
/* 输入密码和确认密码,如果两次密码一致则显示注册成功,两次密码不一致则提示重新输入 */ Scanner input = new Scanner(System.in); String pwdOne = ""; String pwdTwo = ""; do{ System.out.println("请输入密码"); pwdOne = input.next(); System.out.println("请输入确认密码"); pwdTwo = input.next(); if(!pwdOne.equals(pwdTwo)){ System.out.println("两次密码不一致,请重新输入"); } }while(!pwdOne.equals(pwdTwo)); System.out.println("注册成功");
循环语句的区别
从循环次数角度分析
- do...while循环至少执行一次循环体语句
- for和while循环先循环条件语句是否成立,然后决定是否执行循环体,至少执行零次循环体语句
从循环变量的生命周期角度分析
- for循环的循环变量在for()中声明的,在循环语句结束后,不可以被访问;
- while和do...while循环的循环变量因为在外面声明的,所以while和do...while结束后可以被继续使用的;
如何选择
- 遍历有明显的循环次数(范围)的需求,选择for循环
- 遍历没有明显的循环次数(范围)的需求,循环while循环
- 如果循环体语句块至少执行一次,可以考虑使用do...while循环
本质上:三种循环之间是可以互相转换的,都能实现循环的功能
三种循环结构都具有四要素:
- 循环变量的初始化表达式
- 循环条件
- 循环变量的修改的迭代表达式
- 循环体语句块
死循环
也就是循环中的条件永远为true,死循环的是永不结束的循环。例如:while(true){}。 在后期的开发中,会出现使用死循环的场景,例如:我们需要读取用户输入的输入,但是用户输入多少数据我们 并不清楚,也只能使用死循环,当用户不想输入数据了,就可以结束循环了,如何去结束一个死循环呢,就需要使用到跳出语句了
死循环格式:
/* (1)for循环的死循环格式 for(;;){循环体} (2)while循环的死循环格式 while(true){循环体} (3)do-while循环的死循环格式 do{ 循环体 }while(true); */
break控制语句
使用场景
- 使用在switch语句中,用来结束switch语句,执行switch语句后面的其它语句
- 使用在循环中,用来结束循环(1.本次循环的循环体中break后面的代码不再执行 2.剩余次数的循环也不再执行),执行循环后面的其它语句
- break不能使用在出switch和循环语句以外的其它位置
代码示例
public class Demo01Break { public static void main(String[] args) { System.out.println("顾客获取到了购买的四个包子.........."); for (int num = 1; num <= 4; num++) { /* 当num的值为2时,num == 2 --> true,if后面()中是true,执行if后面{}中的内容, 首先: 执行输出语句 其次: 执行break,一旦执行break,本次循环的循环体中break后面的代码不再执行, 剩余次数的循环也不再执行,直接从循环中跳出到循环后面的其它代码继续执行 */ if (num == 2) { System.out.println("发现2号包子上有个大家伙(小强),2号(及剩余所有)包子不能吃了,找老板投诉"); break; } System.out.println("顾客吃第" + num + "个包子......"); } System.out.println("顾客投诉: 这是神马包子,岂有此理.老板: 非常抱歉,赔偿100000元~~~~~"); } }
图解分析:
案例:
//从键盘输入不断输入整数,输入0表示结束,统计一共有几个正数、负数。 public class Demo02Break { public static void main(String[] args) { java.util.Scanner input = new java.util.Scanner(System.in); int positive = 0; int negative = 0; while (true) { System.out.print("请输入整数(0)结束:"); int num = input.nextInt(); if (num == 0) { break; } else if (num > 0) { positive++; } else { negative++; } } System.out.println("正数:" + positive + ",负数:" + negative); } }
循环标号:
如果需要告诉break跳出指定的循环,可以给其起一个标号,例如:
import java.util.Scanner; public class Test { /* 需求:程序运行后,用户可多次查询星期对应的减肥计划,直到输入0,程序结束 步骤: 1. 不明确用户操作几次, 使用死循环包裹业务逻辑 2. 匹配到0的时候,使用break结束循环死循环 */ public static void main(String[] args) { lo: while (true) { System.out.println("请输入您要查看的星期数:"); System.out.println("(如无需继续查看,请输入0退出程序)"); // 1. 键盘录入星期数据,使用变量接收 Scanner sc = new Scanner(System.in); int week = sc.nextInt(); // 2. 多情况判断,采用switch语句实现 switch (week) { // 3. 在不同的case中,输出对应的减肥计划 case 0: System.out.println("感谢您的使用"); break lo; case 1: System.out.println("跑步"); break; case 2: System.out.println("游泳"); break; case 3: System.out.println("慢走"); break; case 4: System.out.println("动感单车"); break; case 5: System.out.println("拳击"); break; case 6: System.out.println("爬山"); break; case 7: System.out.println("好好吃一顿"); break; default: System.out.println("您的输入有误"); break; } } } }
continue控制语句
使用场景:
- 只能使用在循环中,作用是提前结束本次循环,继续进行下一次循环
- 不能使用在除循环结构中的其它位置
package demo05; public class Demo03Continue { public static void main(String[] args) { System.out.println("顾客获取到了购买的四个包子.........."); for (int num = 1; num <= 4; num++) { /* 当num的值为2时,num == 2 --> true,if后面()中是true,执行if后面{}中的内容, 首先: 执行输出语句 其次: 执行continue,一旦执行continue,本次循环的循环体中continue后面的代码不再执行, 继续执行下一次循环的步进表达式 总结: continue的作用提前结束本次循环,继续进行下一次循环 */ if (num == 2) { System.out.println("把第2个包子弄脏了,不能吃第2个包子了,继续吃其它包子..."); continue; } System.out.println("顾客吃第" + num + "个包子......"); } System.out.println("找老板结账,交钱400块,老板说: 欢迎下次光临...."); } }
图解分析:
public class Demo04Continue { public static void main(String[] args) { //打印1-100之间的整数,跳过7的倍数和7结尾的数 for (int i = 1; i <= 100; i++) { if (i % 7 == 0 || i % 10 == 7) { continue; } System.out.println(i); } } }
如果需要告诉continue提前结束指定的循环,继续进行下一次循环,可以给其起一个标号,使用方式和break是一样的。这里代码就不演示了。。
循环嵌套
- 所谓嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总共的循环次数=外循环次数*内循环次数。当然可以是三种循环任意互相嵌套。
for循环相互嵌套格式
嵌套循环执行流程:
- 执行顺序:①②③④⑤⑥>④⑤⑥>⑦②③④⑤⑥>④⑤⑥
- 外层循环执行1次,内层循环执行完整的(从初始化表达式开始)一遍
图解分析:
public class Demo05ForFor { public static void main(String[] args) { //打印2021年至2023年月份 // 年份是外循环,3年;月份是内循环,12月 for (int i = 2021; i <= 2023; i++) { for (int j = 1; j <= 12; j++) { //不换行打印星号 System.out.print(i + "年" + j + "月 "); } //内循环打印12个月后,需要一次换行 System.out.println(); } } }









浙公网安备 33010602011771号