在我们平常的生活中,我们每天都在进行各种判断和重复操作,例如:
- 如果今天下雨,就带伞。
- 如果考试成绩大于或者等于60分,就及格。
- 每天坚持跑步五公里,直到完成目标。
程序也是一样,如果程序只能从第一行一直执行到最后一行,那么它几乎无法完成任何实际业务。
因此,Java 提供了流程控制语句,让程序具备了"思考"和"循环执行"的能力。
Java 中的流程控制主要包括三种:
- 顺序结构
- 选择结构(分支)
- 循环结构
一、什么是流程控制
流程控制(Flow Control)是指控制程序执行顺序的一组语法结构。
Java 程序默认采用顺序执行。
例如:
System.out.println("开始");System.out.println("学习 Java");System.out.println("结束");输出:
开始 学习Java结束程序会按照代码的书写顺序依次执行。
但在实际开发中,我们经常需要根据条件执行不同的代码,或者重复执行某段代码,这时就需要使用流程控制。
二、选择结构
2.1 if语句
if 是 Java 中最常用的条件判断语句。在if语句中,又分为单分支、双分支、多分之。
单分支if:
语法:
if(条件表达式){// 条件成立时执行}示例:
intage=20;if(age>=18){System.out.println("已成年");}输出:
已成年如果条件不成立,则不会执行 if 代码块。
双分支if…else:
语法:
if(条件){// 条件成立}else{// 条件不成立}示例:
intscore=58;if(score>=60){System.out.println("考试通过");}else{System.out.println("考试不通过");}输出:
考试不通过多分支if…else if:
语法:
if(条件1){}elseif(条件2){}elseif(条件3){}else{}示例:
intscore=85;if(score>=90){System.out.println("优秀");}elseif(score>=80){System.out.println("良好");}elseif(score>=60){System.out.println("及格");}else{System.out.println("不及格");}输出:
良好if 判断执行流程:
程序会按照顺序依次判断条件:
- 第一个条件成立,后面的条件将不会继续判断。
- 所有条件都不成立,则执行 else。
因此,多个条件之间要注意顺序。
例如:
if(score>=60){}elseif(score>=80){}这种写法是存在问题的。因为80 已经满足 >= 60,所以后面的判断永远不会执行。
正确的写法:
if(score>=90){}elseif(score>=80){}elseif(score>=60){}注意:如果在if语句后面加上分号后,这就会导致分号成为了if语句的语句体,此时执行{ }中的代码是没有任何条件的。例如:
intx=20;if(x==20);// 因为这个结尾加了分号// 此处多写了一个分号, 导致分号成为了 if 语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块,所以就会按照代码执行的顺序往下执行{System.out.println("x == 20");}2.2 switch语句
当需要针对一个变量的多个固定值进行判断时,使用 switch 更加简洁。
语法:
switch(表达式){case值1:代码;break;case值2:代码;break;default:默认代码;}示例:
intday=3;switch(day){case1:System.out.println("星期一");break;case2:System.out.println("星期二");break;case3:System.out.println("星期三");break;default:System.out.println("未知");}输出:
星期三break 的作用:
很多初学者容易忘记break。
例如:
intnum=1;switch(num){case1:System.out.println("A");case2:System.out.println("B");case3:System.out.println("C");}输出:
ABC原本只是想输出A,但是为什么会输出ABC,问题就出现在没有break,程序会发生穿透。
正确的写法:
case1:System.out.println("A");break;注意:在switch中,它并不支持任何类型的参数,Java 不同版本支持的数据类型也有所不同。
常见支持的有:
byteshortcharintString(Java7+)enum(枚举)不支持的有:
doublefloatbooleanlong三、循环结构
循环就是重复执行代码。
Java 提供三种循环:
- for
- while
- do…while
3.1 for循环
这是最常用的循环。
语法:
for(初始化;条件;更新){}例如:
for(inti=1;i<=5;i++){System.out.println(i);}输出:
12345for执行流程:
执行顺序:
初始化 ↓ 判断条件 ↓ 执行循环体 ↓ 更新变量 ↓ 继续判断(一直到条件不满足才会调整循环)例子:
求 1 ~ 100的和:
intsum=0;for(inti=1;i<=100;i++){sum+=i;}System.out.println(sum);// 输出5050输出九九乘法表:
for(inti=1;i<=9;i++){for(intj=1;j<=i;j++){System.out.print(j+"*"+i+"="+(i*j)+"\t");}System.out.println();}输出:1*1=11*2=22*2=4...3.2 while循环
这个循环比较适用于循环次数未知的情况。
语法:
while(条件){}示例:
inti=1;while(i<=5){System.out.println(i);i++;}输出:
12345while 与 for 的区别:
for:
for(inti=1;i<=100;i++)适合:已知循环次数。
例如:
- 输出 100 次
- 遍历数组
- 遍历集合
while:
while(passwordWrong){}适合:不知道循环多少次。
例如:
- 登录验证
- 文件读取
- Socket 通信
- 用户输入
3.3 do…while循环
这个循环的特点就是:先执行一次,再判断条件。
语法:
do{}while(条件);示例:
inti=1;do{System.out.println(i);i++;}while(i<=5);输出:
12345即使条件不成立:
inti=10;do{System.out.println(i);}while(i<5);也会输出:10,因为这个循环是:先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束。
3.4 break 与 continue
break的作用在于:立即结束循环。
示例:
for(inti=1;i<=10;i++){if(i==5){break;}System.out.println(i);}输出:
1234执行到 break 就会让循环结束.
continue的作用在于:结束本次循环,继续下一次循环。
示例:
for(inti=1;i<=5;i++){if(i==3){continue;}System.out.println(i);}输出:
1245执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句
3.5 循环嵌套
循环里面还可以继续写循环。
例如:
for(inti=1;i<=3;i++){for(intj=1;j<=2;j++){System.out.println(i+"-"+j);}}输出:
1-11-22-12-23-13-2常用于:
- 打印图形
- 遍历二维数组
- 数据组合
- 矩阵运算
3.6 死循环
所谓死循环,就是循环条件始终成立,程序无法正常结束。
例如:
while(true){System.out.println("Hello Java");}或者:
for(;;){System.out.println("Hello Java");}死循环并不一定是错误,在服务器程序、消息监听、网络通信等场景中会经常使用,但通常需要结合 break 或其他退出条件。
四、经典案例
案例一:判断闰年
intyear=2026;if((year%4==0&&year%100!=0)||year%400==0){System.out.println(year+" 是闰年");}else{System.out.println(year+" 是平年");}案例二:输出 1~100 之间所有偶数
for(inti=1;i<=100;i++){if(i%2==0){System.out.println(i);}}案例三:猜数字
Randomrandom=newRandom();Scannerscanner=newScanner(System.in);inttoGuess=random.nextInt(100);while(true){System.out.println("请输入数字:(1-100)");intnum=scanner.nextInt();if(num>toGuess){System.out.println("大了");}elseif(num<toGuess){System.out.println("小了");}else{System.out.println("猜对了");break;}}scanner.close();