一、流程控制
1.1 概述
程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
1.2 顺序结构
顺序执行,根据编写的顺序,从上到下运行
二、判断语句
2.1 单if语句
2.1.1 格式
if(关系表达式){
语句体;
}
2.1.2 执行流程
首先判断关系表达式看其结果是 true还是false
- 如果是 true 就执行【语句体】
- 如果是 false 就不执行【语句体】
public class Demo02If {
public static void main(String[] args) {
System.out.println("今天天气不错,正在压马路……突然发现一个快乐的地方:网吧");
int age = 19;
if (age >= 18) {
System.out.println("进入网吧,开始high!");
System.out.println("遇到了一群猪队友,开始骂街。");
System.out.println("感觉不爽,结账走人。");
}
System.out.println("回家吃饭");
}
}
2.2 if…else语句
2.2.1 格式
if(关系表达式) {
语句体1;
}else {
语句体2;
}
2.2.2 执行流程
首先判断关系表达式看其结果是 true还是false
- 如果是 true 就执行【语句体1】
- 如果是 false 就执行【语句体2】
public class Demo03IfElse {
public static void main(String[] args) {
int num = 666;
if (num % 2 == 0) { // 如果除以2能够余数为0,说明是偶数
System.out.println("偶数");
} else {
System.out.println("奇数");
}
}
}
2.3 if…else if…else语句
2.3.1格式
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}
...
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
2.3.2 执行过程
首先判断关系表达式 1 看其结果是 true 还是 false
- 如果是 true 就执行【语句体1】
如果是 false 就继续判断关系表达式 2 看其结果是 true 还是 false
- 如果是 true 就执行【语句体 2】
如果是 false 就继续判断关系表达式…看其结果是 true 还是 false
…- 如果没有任何关系表达式为 true,就执行【语句体 n+1】。
// x和y的关系满足如下:
// 如果x >= 3,那么y = 2x + 1;
// 如果-1 < x < 3,那么y = 2x;
// 如果x <= -1,那么y = 2x – 1;
public class Demo04IfElseExt {
public static void main(String[] args) {
int x = -10;
int y;
if (x >= 3) {
y = 2 * x + 1;
} else if (-1 < x && x < 3) {
y = 2 * x;
} else {
y = 2 * x - 1;
}
System.out.println("结果是:" + y);
}
}
2.4 练习
需求:指定考试成绩,判断学生等级,90-100 优秀,80-89 好,70-79 良=,60-69 及格,60 以下 不及格。
public class Demo05IfElsePractise {
public static void main(String[] args) {
int score = 120;
if (score >= 90 && score <= 100) {
System.out.println("优秀");
} else if (score >= 80 && score < 90) {
System.out.println("好");
} else if (score >= 70 && score < 80) {
System.out.println("良");
} else if (score >= 60 && score < 70) {
System.out.println("及格");
} else if (score >= 0 && score < 60) {
System.out.println("不及格");
} else { // 单独处理边界之外的不合理情况
System.out.println("数据错误");
}
}
}
2.5 if…else语句与三元运算符互换
// 使用三元运算符和标准的if-else语句分别实现:取两个数字当中的最大值
public class Demo06Max {
public static void main(String[] args) {
int a = 105;
int b = 20;
// 首先使用三元运算符
// int max = a > b ? a : b;
// 使用今天的if语句
int max;
if (a > b) {
max = a;
} else {
max = b;
}
System.out.println("最大值:" + max);
}
}
三、选择语句
3.1 switch语句
3.1.1 格式
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
3.1.2 执行流程
首先计算出表达式的值
- case依次比较,一旦有对应的值,就会执行相应的语句体,如果没遇到break就会一直执行后面case里面的语句体,知道遇到break才会结束。
- 最后,如果所有的 case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
public class Demo07Switch {
public static void main(String[] args) {
int num = 10;
switch (num) {
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; // 最后一个break语句可以省略,但是强烈推荐不要省略
}
}
}
3.2 注意事项
1. case 后面的数值不可以重复。
3. case 后面可以是常量也可以是常量的运算(包括强制转换)。
4. switch 后面小括号当中只能是下列数据类型:
基本数据类型: byte / short / char / int
引用数据类型: String 、 enum 枚举 、 Character 、 Byte 、 Short 、 Integer
5. switch 如果是【基本数据类型】和 Character 、 Byte 、 Short ,那必须与 case 类型符合数据类型转换规则(即符合类型转换的类型和取值范围)。
6. 如果 switch 是 String 、 enum 、 Integer ,那 case 只能是对应的类型。
7. default 和 case 语句没有顺序,可以写在任一位置。
8. 如果 case 的后面不写 break ,将出现穿透现象,也就是不会再判断下一个 case 的值,直接向后运行,直到遇到 break ,或者整体 switch 结束。
9. 最后一个语句的 break ,可以不写,因为后面已经没有语句了,但不推荐。
四、循环语句
4.1 概述
循环结构的基本组成部分:
- 初始化语句:在循环开始最初执行,而且只做唯一一次。
- 条件判断:如果成立,则循环继续;如果不成立,则循环退出。
- 循环体:重复要做的事情内容,若干行语句。
- 步进语句:每次循环之后都要进行的扫尾工作,每次循环结束之后都要执行一次。
4.2 for循环语句
4.2.1 格式
for(初始化表达式①; 布尔表达式②; 步进表达式④){
循环体③
}
4.2.2 执行流程
执行顺序:①②③④ >②③④>②③④…直到②不满足为止。
- ① 负责完成循环变量初始化
- ② 负责判断是否满足循环条件,不满足则跳出循环
- ③ 具体执行的语句
- ④ 循环后,循环条件所涉及变量的变化情况
public class Demo09For {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
System.out.println("我错啦!原谅我吧!" + i);
}
System.out.println("程序停止");
}
}
4.3 while循环语句
4.3.1 格式
初始化表达式①
while(布尔表达式②){
循环体③
步进表达式④
}
4.3.2 执行流程
执行顺序:①②③④ >②③④>②③④…直到②不满足为止。
- ① 负责完成循环变量初始化。
- ② 负责判断是否满足循环条件,不满足则跳出循环。
- ③ 具体执行的语句。
- ④ 循环后,循环变量的变化情况。
public class Demo10While {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("我错啦!" + i);
}
System.out.println("=================");
int i = 1; // 1. 初始化语句
while (i <= 10) { // 2. 条件判断
System.out.println("我错啦!" + i); // 3. 循环体
i++; // 4. 步进语句
}
}
}
4.4 do…while循环语句
4.4.1 格式
初始化表达式①
do{
循环体③
步进表达式④
}while(布尔表达式②);//注意这里有分号!!!
4.4.2 执行流程
执行顺序:①③④ >②③④>②③④…②不满足为止。
- ①负责完成循环变量初始化。
- ②负责判断是否满足循环条件,不满足则跳出循环。
- ③具体执行的语句
- ④循环后,循环变量的变化情况
public class Demo11DoWhile {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("原谅你啦!起来吧!地上怪凉!" + i);
}
System.out.println("===============");
int i = 1; // 1. 初始化语句
do {
System.out.println("原谅你啦!起来吧!地上怪凉!" + i); // 3. 循环体
i++; // 4. 步进语句
} while (i <= 10); // 2. 条件判断
}
}
4.5 循环语句区别
- 如果条件判断从来没有满足过,那么for循环和while循环将会执行0次,但是do-while循环会执行至少一次。
- for循环的变量在小括号当中定义,只有循环内部才可以使用。while循环和do-while循环初始化语句本来就在外面,所以出来循环之后还可以继续使用。
public class Demo13LoopDifference {
public static void main(String[] args) {
for (int i = 1; i < 0; i++) {
System.out.println("Hello");
}
// System.out.println(i); // 这一行是错误写法!因为变量i定义在for循环小括号内,只有for循环自己才能用。
System.out.println("================");
int i = 1;
do {
System.out.println("World");
i++;
} while (i < 0);
// 现在已经超出了do-while循环的范围,我们仍然可以使用变量i
System.out.println(i); // 2
}
}
在已知循环次数的时候使用推荐使用 for,循环次数未知的时推荐使用while。
4.6 跳出语句
4.6.1 break
break除了可以用于switch语句,还可以用于循环语句中,表示跳出循环语句;除了这两种场景,其他地方都不能用break。
public class Demo14Break {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
// 如果希望从第4次开始,后续全都不要了,就要打断循环
if (i == 4) { // 如果当前是第4次
break; // 那么就打断整个循环
}
System.out.println("Hello" + i);
}
}
}
4.6.2 continue
立刻跳过当前次循环剩余内容,马上开始下一次循环。
public class Demo15Continue {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i == 4) { // 如果当前是第4层
continue; // 那么跳过当前次循环,马上开始下一次(第5层)
}
System.out.println(i + "层到了。");
}
}
}
4.7 死循环
死循环: 也就是循环中的条件永远为true,死循环的是永不结束的循环。例如:while(true){}。
- 在后期的开发中,会出现使用死循环的场景,例如:我们需要读取用户输入的输入,但是用户输入多少数据我们并不清楚,也只能使用死循环,当用户不想输入数据了,就可以结束循环了,如何去结束一个死循环呢,就需要使用到跳出语句了。
注意: 如果死循环后面没有其他语句,不会报错;如果死循环后面有其他语句时,编译会报错,因为后面的语句无法执行。
public class Demo16DeadLoop {
public static void main(String[] args) {
while (true) {
System.out.println("I Love Java!");
}
// System.out.println("Hello");
}
}
4.8 嵌套循环
是指循环里面还可以嵌套循环
public class Demo17LoopHourAndMinute {
public static void main(String[] args) {
for (int hour = 0; hour < 24; hour++) { // 外层控制小时
for (int minute = 0; minute < 60; minute++) { // 内层控制小时之内的分钟
System.out.println(hour + "点" + minute + "分");
}
}
}
}