一、流程控制
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 、 Integer5. 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循环的范围,我们仍然可以使用变量iSystem.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 + "分");}}}}
