更好的阅读体验:点这里 ( www.doubibiji.com
)
更好的阅读体验:点这里 ( www.doubibiji.com
)
更好的阅读体验:点这里 ( www.doubibiji.com
)
4 流程控制
4.1 分支结构
判断在生活中无处不在,例如我们登录某个系统,需要判断密码是否正确,正确才能登录,否则登录失败。
1 if-else 语句
在 Java 中通过 if else 来进行条件的判断,格式如下:
if (condition) {
// condition为true时执行的代码块
} else {
// condition为false时执行的代码块
}
也可以不需要 else
:
if (condition) {
// 条件成立,要做的事情
}
if
后面的条件 condition
需要 boolean
类型的值、变量或表达式,也就是 true
或 false
。
举个栗子,判断一个数是否为偶数:
public static void main(String[] args) {
int num = 5;
if (num % 2 == 0) {
System.out.println(num + " 是偶数");
} else {
System.out.println(num + " 是奇数");
}
}
执行结果:
5 是奇数
一般情况下,我们经常通过 关系运算 和 逻辑运算 作为 if 的判断条件。
举个栗子:
public static void main(String[] args) {
int a = 5;
if (a > 0 && a < 10)
System.out.println("a在0~10之间");
}
如果 if
或 else
后面只有一条语句,可以省略 {}
。
2 if-elseif-else 语句
if-else
只能进行是和否的判断。
if-elseif-else
可以进行多条件判断。
语法格式:
if (condition1) {
// condition1为true时执行的语句块
} else if (condition2) {
// condition2为true时执行的语句块
} else {
// 所有条件都为false时执行的语句块
}
else-if
可以有多个,最后的 else
可以省略。
当满足一个条件后,其他的条件就不会再判断了,如果所有条件都不满足,会执行 else
。
下面通过练习来举个栗子:
给出成绩,经过判断,打印出输入的成绩是优秀、良好、中等、及格还是不及格。
public static void main(String[] args) {
int score = 85;
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 >= 70) {
System.out.println("中等");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
}
上面的输出结果为:良好
重新修改一下程序,读取键盘的输入作为值,这里用到读取键盘输入,需要用到 Scanner 类,所以需要使用 import
进行导入,import
的知识点,后面再讲解。
import java.util.Scanner;
public class HelloJava {
public static void main(String[] args) {
// 声明一个Scanner,用于读取键盘的输入
Scanner scan = new Scanner(System.in);
// 读取的输入
int score = scan.nextInt();
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 >= 70) {
System.out.println("中等");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
}
}
nextInt()
表示以整形数据的形式读取键盘输入。当程序执行到 scan.nextInt();
的时候,程序会阻塞在这里,等待用户的输入,输入完成,才会继续执行。
if-else语句都是可以相互嵌套的,可以在 if-else 判断中再进行 if-else 判断。
举个栗子:
public static void main(String[] args) {
int x = 10;
int y = 20;
if (x > 5) {
if (y > 15) {
System.out.println("x 大于 5,y 大于 15");
} else {
System.out.println("x 大于 5,y 小于等于 15");
}
} else {
if (y > 10) {
System.out.println("x 小于等于 5,y 大于 10");
} else {
System.out.println("x 小于等于 5,y 小于等于 10");
}
}
}
3 三目运算符
假设现在有两个数字,我们希望获得其中较大的一个,那么可以使用 if-else
语句,例如:
public static void main(String[] args) {
int a = 4;
int b = 5;
int max;
if (a > b)
max = a;
else
max = b;
System.out.println("最大值为:" + max); // 最大值为:5
}
我们可以使用三目运算符来完成上面的功能,代码会更简洁的写法:
public static void main(String[] args) {
int a = 4;
int b = 5;
int max = a > b ? a : b;
System.out.println("最大值为:" + max); // 最大值为:5
}
int max = a > b ? a : b;
的意思是:先判断 a > b
,如果成立,就返回 a
,不成立就返回 b
。
代码简洁了确实很多。能用三目运算符的地方都可以使用 if-else
代替。
4 switch语句
switch语句也是一种判断语句,通常用于对多个可能的值进行比较。switch语句的语法如下:
switch (value) {
case value1:
// value == value1 时执行的代码块
break;
case value2:
// value == value2 时执行的代码块
break;
default:
// value 不等于上面所有的case 时执行的代码块
}
注意:switch(value) 中的value,只能是byte、short、char、int、枚举类型(后面再讲)、String类型这六种数据类型
以下是一个示例代码,通过数字判断季节:
public static void main(String[] args) {
int day = 2;
switch (day) {
case 1:
System.out.println("春季");
break;
case 2:
System.out.println("夏季");
break;
case 3:
System.out.println("秋季");
break;
case 4:
System.out.println("冬季");
break;
default:
System.out.println("错误的季节");
}
}
当 day
满足哪个 case
,就会执行哪个 case
后面的代码。
执行结果:
夏季
注意,每个case后,都需要进行 break
或 return
,否则会跳到下一个 case
。
举个栗子:
public static void main(String[] args) {
int day = 2;
switch (day) {
case 1:
System.out.println("春季");
break;
case 2:
System.out.println("夏季");
case 3:
System.out.println("秋季");
case 4:
System.out.println("冬季");
break;
default:
System.out.println("错误的季节");
}
}
因为 case 2
没有 break
,所以执行完成,会跳到 case 3
执行,执行完 case 3
没有 break
或 return
,会继续跳到 case 4
执行,执行完成,case 4
有 break
,则跳出。
执行结果:
夏季
秋季
冬季
如果对多个 case 的处理是一样的,就可以将 break 省略。
例如下面的代码中,day 为1,2,3,打印的都是秋季。
public static void main(String[] args) {
int day = 2;
switch (day) {
case 1:
case 2:
case 3:
System.out.println("秋季");
case 4:
System.out.println("冬季");
break;
default:
System.out.println("错误的季节");
}
}
4.2 循环语句
循环在日常生活中也很常见,例如我们要重复做某件事,就需要用到循环,循环不停的做某件事。
举个栗子,每天向小红送一条玫瑰花,坚持送100天,这个应该怎么实现呢?
1 for 循环
for循环是一种常用的循环语句,可以指定循环变量的初始值、终止条件和步长。
for循环的语法如下:
// 对应下面的各个部分
for(①初始化部分; ②循环条件部分; ④迭代部分){
③循环体部分;
}
// 执行过程是①-②-③-④-②-③-④-②-③-④......②
// 执行①,然后执行②,判断②是否成立,如果成立,执行③,③执行完成,执行④,④执行完成,再次判断②是否成立,成立继续一轮循环,执行③,②不成立,退出循环。
举个栗子:
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
}
先执行 int i = 1
,定义一个变量 i
,然后执行 i <= 5
,判断 i
是否小于等于5,如果为 true
,则执行循环体中的代码 System.out.println(i);
,执行完循环体中的代码,执行 i++
,然后再次执行 i <= 5
,判断i
是否小于等于5,直到 i <= 5
不满足,则终止循环。
打印结果:
1
2
3
4
5
再举个例子:
for (int i = 1, j = 10; i <= 5 && j > 0 ; i++, j--) {
System.out.println(i + j);
}
从上面可以看出,初始化可以定义多个变量,但是变量的类型要一样。
使用 for 循环也是可以定义死循环
的。
什么是死循环,就是一直循环,不会终止的循环。
举个栗子:
下面的循环中,不执行步长的增长,i
始终为1,则 i <= 5
永远成立,所以循环不会终止。
for (int i = 1; i <= 5;) {
System.out.println(i);
}
还可以这样写:
int i = 0;
for (;;) {
System.out.println(i++);
}
上面的 for
循环会一直执行,不停的打印 i
的值,i
的值会一直增长。
在实际的开发中,for 循环是用的最多的。
2 while 循环
可以使用 while
进行循环操作。
while
循环的语法:
while (condition) {
// condition为真时执行的代码块
}
代码执行到while,会判断是否满足条件,如果满足,就会进入while循环,执行满足条件要做的事情,执行完成,会重新判断while后面的条件,如果满足会继续循环,如果不满足就不在进入循环。
回到一开始的提问:每天向小红送一条玫瑰花,坚持送100天,这个应该怎么实现呢?
public static void main(String[] args) {
int i = 1;
while (i <= 100) {
System.out.println("第" + i +"天,送你一朵玫瑰花");
i += 1;
}
}
首先我们定义了一个变量 i ,用来记录当前是第几天。
我们一开始定义了 i 为 1,执行到 while 循环时,先判断 i 是否小于等于100,如果小于等于100,则进入到循环,打印语句,然后执行 i += 1;
将 i 加1,然后再执行while后面的条件判断,判断 i <= 100,这样一直循环执行,当 i = 101时,刚好已经执行了100次,且不再满足 i < =100,此时终止循环。
注意,一定要对 i 进行累加,如果 i 不进行累加,永远会满足 i <= 100,那么循环将永远不会结束,变成死循环。
执行结果:
第1天,送你一朵玫瑰花
第2天,送你一朵玫瑰花
……
第99天,送你一朵玫瑰花
第100天,送你一朵玫瑰花
我们在计数的时候,i 也可以从0开始,例如:
public static void main(String[] args) {
int i = 0;
while (i < 100) {
System.out.println("第" + (i + 1) + "天,送你一朵玫瑰花");
i += 1;
}
}
判断的条件的设定是很灵活的,根据实际需求来就可以了,不是一成不变的。
练习:计算从1累加到100的和
public static void main(String[] args) {
int sum = 0; // 定义一个变量,存储累加的和
int i = 1; // 定义一个变量,标识累加到几了,从1开始累加
while (i <= 100) {
sum += i; // 将和累加
i += 1; // 将i加1,继续累加
}
System.out.println("1~100的和为:" + sum); // 打印最终的结果
}
执行结果:
1~100的和为:5050
使用 while 循环的地方都可以使用 for 循环代替。
3 do-while 循环
do...while
循环与 while
循环的区别在于,do...while
循环先执行一次循环体中的代码,再检查条件是否为真。如果条件为真,则继续执行循环体中的代码。
do...while
循环的语法如下:
do {
// 循环体中的代码块
} while (condition);
举个栗子,再送一遍花:
public static void main(String[] args) {
int i = 1;
do {
System.out.println("第" + i + "天,送你一朵玫瑰花");
i += 1;
} while (i <= 100);
}
4 循环嵌套
循环是可以相互嵌套的,while
和 for
循环中可以再次嵌套 while
和 for
循环。
例如每天给小红送10多玫瑰花,坚持100天。
public static void main(String[] args) {
int day = 1; // 记录第几天
while (day <= 100) { // 外层循环用于循环天数
for (int roseCount = 1; roseCount <= 10; roseCount++) { // 内层循环用于循环花的朵数
System.out.println("第" + day + "天,第" + roseCount + "朵玫瑰花");
}
day += 1; // 天数+1
}
}
for
、while
、do-while
循环都可以进行多层嵌套。
一般我们使用 for 循环是最多的,要简洁一些:
public static void main(String[] args) {
for (int day = 1; day < 100; day++) { // 外层循环用于循环天数
for (int roseCount = 1; roseCount <= 10; roseCount++) { // 内层循环用于循环花的朵数
System.out.println("第" + day + "天,第" + roseCount + "朵玫瑰花");
}
}
}
5 中断循环
我们在前面终止循环,主要是靠不满足条件时自动跳出。这样的话,必须每一次的循环都执行完成,到达条件判断的时候才能跳出。
但是有时候,我们不得不提前退出循环,或者终止当前的循环继续后面的循环,这个时候就需要 break
和 continue
关键字了。
break 语句
break 关键字用于直接结束当前所在的循环。
举个栗子:
如果一个循环,想在执行第三次的时候跳出:
public static void main(String[] args) {
int i = 0;
while (i < 10) {
if (i == 3) {
break;
}
System.out.println("i=" + i);
i++;
}
}
执行结果:
i=0
i=1
i=2
可以看到 i = 3
时,跳出了循环。
break只会跳出其所在的循环
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
for (int j = 0; i < 10; j++) {
if (j == 3) {
break;
}
System.out.println("i=" + i + ", j=" + j);
}
}
}
上面的代码,break只能跳出内部的那一个循环。无法跳出外部的循环。
如果就是想跳出外部的循环呢?
那就需要给外部的循环添加一个标签,举个栗子:
public static void main(String[] args) {
outer : for (int i = 0; i < 10; i++) {
for (int j = 0; i < 10; j++) {
if (j == 3) {
break outer;
}
System.out.println("i=" + i + ", j=" + j);
}
}
}
上面的代码中,给外层循环添加了一个 outer
标签,标签名称是自定义的;在循环内,可以通过 break 标签
来跳出指定的循环。
可以为每个循环添加标签,如果有多层循环,可以通过这样的方式跳出想要跳出的循环。while 循环也可以添加标签。
continue 语句
continue的作用是中断本次循环,直接进入下一次循环。
举个栗子:
循环5次,在第三次的时候跳过,继续后面的执行:
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
if (i == 3) {
continue;
}
System.out.println("i=" + i);
}
}
在上面 i == 3
的时候,终止了本次循环,直接跳到 i++
,继续后面的执行。
执行结果:
i=0
i=1
i=2
i=4
同样,continue 和 break 一样,也可以选择终止的是哪一层的循环。
举个栗子:
public static void main(String[] args) {
outer : for (int i = 0; i < 10; i++) {
for (int j = 0; i < 10; j++) {
if (j == 3) {
continue outer;
}
System.out.println("i=" + i + ", j=" + j);
}
}
}
在上面的代码中,给外层循环定义了一个标签,每次执行到 j == 3
,就会终止本次循环,直接跳转到外层循环的 i++
,继续后面的循环。
4.3 练习
随机生成一个1-100的整数,然后在键盘输入数字来猜,猜不对,提示大了还是小了,猜对了,跳出循环。
在这里我们需要生成一个随机数,需要导入一个包 java.util.Random
,用来生成 1~100
的随机数;
需要键盘输入,需要导入java.util.Scanner
包。
// 导入包
import java.util.Random;
import java.util.Scanner;
public class HelloJava {
public static void main(String[] args) {
Random random = new Random();
// 随机生成1-100的目标数
// random.nextInt(100)表示生成0-100的随机数,包括0,不包括100
// 在[0,100)的基础上+1就是[1,101),1~100
var goal = random.nextInt(100) + 1;
while (true) {
System.out.println("请猜随机数的大小:"); // 打印信息,提示用户输入
Scanner scan = new Scanner(System.in);
int value = scan.nextInt(); // 获取键盘输入的数值
if (value < 1 || value > 100) {
System.out.println("请输入1-100之间的整数!");
continue;
}
if (value == goal) {
System.out.println("猜对了!");
break; // 如果猜对了,就跳出循环
} else if (value < goal) {
System.out.println("猜小了!");
} else {
System.out.println("猜大了!");
}
}
}
}