一.概述
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
二.顺序结构
代码:
public class ProcessControl{
public static void main(String[] args){
//顺序执行,根据编写的顺序,从上到下运行
System.out.println(1);
System.out.println(2);
System.out.println(3);
}
}
运行结果:
二.判断/选择结构
(一)判断语句—if
1.基本格式
if(关系表达式){
语句体;
}
2.执行流程
- 首先判断关系表达式看其结果是
true
还是false
- 如果是
true
就执行语句体 - 如果是
false
就不执行语句体
代码:
public class ProcessControl{
public static void main(String[] args){
System.out.println("开始");
// 定义两个变量
int a = 10;
int b = 20;
int c = 10;
//变量使用if判断
if (a == b){
System.out.println("a等于b");
}
if(a == c){
System.out.println("a等于c");
}
System.out.println("结束");
}
}
运行结果:
(二)判断语句—if...else
1.基本格式
if(关系表达式) {
语句体1;
}else {
语句体2;
}
2.执行流程
- 首先判断关系表达式看其结果是true还是false
- 如果是true就执行语句体1
- 如果是false就执行语句体2
代码:
public class ProcessControl{
public static void main(String[] args){
// 判断给定的数据是奇数还是偶数
// 定义变量
int a = 1;
int b = 14;
if(a % 2 == 0) {
System.out.println("a是偶数");
} else{
System.out.println("a是奇数");
}
if(b % 2 == 0) {
System.out.println("b是偶数");
} else{
System.out.println("b是奇数");
}
System.out.println("结束");
}
}
运行结果:
(三)判断语句—if..else if...else
1.基本格式
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}
...
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
2.执行流程
- 首先判断关系表达式1看其结果是true还是false
- 如果是true就执行语句体1
- 如果是false就继续判断关系表达式2看其结果是true还是false
- 如果是true就执行语句体2
- 如果是false就继续判断关系表达式…看其结果是true还是false
… - 如果没有任何关系表达式为true,就执行语句体n+1。
代码:
public class ProcessControl{
public static void main(String[] args) {
// x和y的关系满足如下:
// x>=3 y = 2x + 1;
//‐1<=x<3 y = 2x;
// x<=‐1 y = 2x – 1;
// 根据给定的x的值,计算出y的值并输出。
// 定义变量
int x = 2;
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的值是:"+y);
}
}
运行结果:
3.用if..else if...else实现判断考试成绩
代码:
public class ProcessControl {
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("数据错误");
}
}
}
运行结果:
4.用if...else语句替换三元运算符
代码:
public class ProcessControl {
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);
}
}
运行结果:
(四)选择语句—switch
1.基本格式
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
2.执行流程
- 首先计算出表达式的值
- 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
- 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
代码:
public class ProcessControl {
public static void main(String[] args) {
System.out.println("今天星期几?");
// 定义变量,判断是星期几
int weekday = 4;
// switch语句实现选择
switch (weekday) {
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;
}
}
}
运行结果:
注意事项:
- 多个case后面的数值不可以重复。
- switch后面小括号当中只能是下列数据类型:
基本数据类型: byte/short/char/int
引用数据类型: String字符串、enum枚举- switch语句格式可以很灵活:前后顺序可以颠倒,而且break语句还可以省略。(匹配哪一个case就从哪一个位置向下执行,直到遇到了break或者整体结束为止。)
3. case的穿透性
代码:
public class ProcessControl {
public static void main(String[] args) {
int i = 5;
switch (i) {
case 0:
System.out.println("执行case0");
break;
case 5:
System.out.println("执行case5");
case 10:
System.out.println("执行case10");
default:
System.out.println("执行default");
}
}
}
运行结果:
注意事项:
- 上述程序中,执行case5后,由于没有break语句,程序会一直向后走,不会在判断case,也不会理会break,直接运行完整体switch。
三.循环结构
(一)循环语句—for
1.基本格式
for(初始化表达式1; 布尔表达式2; 步进表达式4){
循环体3
}
2.执行流程
执行顺序:1234>234>234…2不满足为止。
- 负责完成循环变量初始化
- 负责判断是否满足循环条件,不满足则跳出循环
- 具体执行的语句
- 循环后,循环条件所涉及变量的变化情况
代码:
public class ProcessControl {
public static void main(String[] args) {
// 控制台输出10次HelloWorld,不使用循环
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("-------------------");
// 用for循环改进,循环10次
// 定义变量从0开始,循环条件为<10
for (int i = 1; i <= 10; i++) {
System.out.println("HelloWorld" + i);
}
}
}
运行结果:
(二)循环语句2—while
1.基本格式
- 标准格式:
while(布尔表达式2){
循环体3
}
- 拓展格式:
初始化表达式1
while(布尔表达式2){
循环体3
步进表达式4
}
2.执行流程
- 标准格式:执行顺序:23>23>23…2不满足为止。
- 负责判断是否满足循环条件,不满足则跳出循环
- 具体执行的语句
- 拓展格式:执行顺序:1234>234>234…2不满足为止。
- 负责完成循环变量初始化
- 负责判断是否满足循环条件,不满足则跳出循环
- 具体执行的语句
- 循环后,循环条件所涉及变量的变化情况
代码:
public class ProcessControl {
public static void main(String[] args) {
// 控制台输出10次HelloWorld,使用while循环
int i = 1;
while (i <= 10) {
System.out.println("HelloWorld" + i);
i++;
}
}
}
运行结果:
(三)循环语句2—do...while
1.基本格式
- 标准格式:
do{
循环体3
}while(布尔表达式2);
- 拓展格式:
初始化表达式1
do{
循环体3
步进表达式4
}while(布尔表达式2);
执行流程
2.执行流程
- 标准格式:执行顺序:32>32>32…2不满足为止。
- 负责判断是否满足循环条件,不满足则跳出循环
- 具体执行的语句
- 拓展格式:执行顺序:134>234>234…2不满足为止。
- 负责完成循环变量初始化。
- 负责判断是否满足循环条件,不满足则跳出循环。
- 具体执行的语句
- 循环后,循环变量的变化情况
代码:
public class ProcessControl {
public static void main(String[] args) {
// 控制台输出10次HelloWorld,使用do...while循环
int i = 1;
do {
System.out.println("HelloWorld" + i);
i++;
} while (i <= 10);
}
}
运行结果:
注意事项:
- do...while循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。
代码:
public class ProcessControl {
public static void main(String[] args) {
do {
System.out.println("无条件执行一次!");
} while (false);
}
}
运行结果:
for 和 while 的小区别:
- 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
- 在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while。
(四)跳出语句
1.break
使用场景:终止switch或者循环
- 在选择结构switch语句中
- 在循环语句中
代码:
public class ProcessControl {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
// 需求:打印完两次HelloWorld之后结束循环
if (i == 3) {
break;
}
System.out.println("HelloWorld" + i);
}
}
}
运行结果:
2.continue
使用场景:结束本次循环,继续下一次的循环
- 在循环语句中
代码:
public class ProcessControl {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
// 需求:不打印第三次HelloWorld
if (i == 3) {
continue;
}
System.out.println("HelloWorld" + i);
}
}
}
运行结果:
(五)死循环
死循环:也就是循环中的条件永远为true,死循环的是永不结束的循环。
1.死循环的标准格式
while(true){
循环体
}
代码:
public class ProcessControl {
public static void main(String[] args) {
while (true) {
System.out.println("Hello!");
}
}
}
运行结果:
- 死循环后边不能有语句,否则编译失败
代码:
public class ProcessControl {
public static void main(String[] args) {
while (true) {
System.out.println("Hello!");
}
System.out.println("Hello!");
}
}
运行结果:
(六)嵌套循环
所谓嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。
总共的循环次数=外循环次数*内循环次数
1.嵌套循环格式:
for(初始化表达式1; 循环条件2; 步进表达式7) {
for(初始化表达式3; 循环条件4; 步进表达式6) {
执行语句5;
}
}
2.执行顺序:
- 123456>456...456>723456>456...456>723456
- 外循环一次,内循环多次。
代码:
public class ProcessControl {
public static void main(String[] args) {
// 需求:使用嵌套循环,打印5*8的矩形
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 8; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
运行结果: