1. 顺序结构
顺序结构比较简单,按照代码书写的顺序一行一行执行。
public class Test { public static void main(String[] args) { System.out.println("aaa"); System.out.println("bbb"); System.out.println("ccc"); /* 运行结果 aaa bbb ccc */ } }
如果调整代码的书写顺序, 则执行顺序也发生变化。
public class Test { public static void main(String[] args) { System.out.println("aaa"); System.out.println("ccc"); System.out.println("bbb"); /* 运行结果 aaa ccc bbb */ } }
2. 分支结构(选择结构)
它的作用是根据判断的条件是否成立(真或假),来决定后续代码执行顺序。
举例:
如同在岔路口做选择。不同的选择会带来不同的路径及结果。
2.1 if 语句
- 语法格式1
if (布尔表达式) { // 语句 }
- 如果布尔表达式结果为
true
,执行if
中的语句,否则不执行。
执行流程:
举例:小明,如果这次考试考60分或以上就不挂科。
public class Test { public static void main(String[] args) { int score = 90; if (score >= 60) { System.out.println("不挂科"); } } }
- 语法格式2
if (布尔表达式) { // 语句 } else { // 语句 }
- 如果布尔表达式结果为
true
,执行if
中的语句,执行else
中的语句。
执行流程:
举例:小明,如果这次考试考60分或以上就不挂科,没有考到60分就挂科。
public class Test { public static void main(String[] args) { int score = 90; if (score >= 60) { System.out.println("不挂科"); } else { System.out.println("挂科"); } } }
- 语法格式3
if(布尔表达式1){ // 语句1 }else if(布尔表达式2){ // 语句2 }else{ // 语句2 }
- 表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3比如:考虑到学生自尊,不公开分数排名,因此:
- 分数在 [90, 100] 之间的,为优秀
- 分数在 [80, 90) 之前的,为良好 分数在 [70, 80) 之间的,为中等
- 分数在 [60, 70) 之间的,为及格 分数在 [ 0, 60) 之间的,为不及格
- 错误数据
- 按照上述办法通知学生成绩。
public class Test { public static void main(String[] args) { int score = 90; if(score >= 90){ 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("错误数据"); } } }
【注意事项】:
- 代码风格
// 风格1-----> 推荐 int x = 10; if (x == 10) { // 语句1 } else { // 语句2 } // 风格2 int x = 10; if (x == 10) { // 语句1 } else { // 语句2 }
- 虽然两种方式都是合法的, 但是 Java 中更推荐使用风格1,代码跟紧凑。
- 分号问题
int x = 20; if (x == 10); { System.out.println("hehe"); } // 运行结果 hehe
- 此处多写了一个 分号, 导致分号成为了
if
语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块,所以运行结果是haha
,而不是空白。 - 悬垂
else
问题
int x = 10; int y = 10; if (x == 10) if (y == 10) System.out.println("aaa"); else System.out.println("bbb");
if else
语句中可以不加大括号 . 但是也可以写语句(只能写一条语句). 此时else
是和最接近的if
匹配. 但是实际开发中我们不建议这么写. 最好加上大括号.
2.2 switch 语句
基本语句
switch(表达式){ case 常量值1:{ 语句1; [break;] } case 常量值2:{ 语句2; [break;] } ... default:{ 内容都不满足时执行语句; [break;] } }
执行流程:
- 先计算表达式的值
- 和
case
依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break
时结束 - 当表达式的值没有与所列项匹配时,执行
default
代码示例:
public class Test { public static void main(String[] args) { String week = "周四"; switch (week) { case "周一": System.out.println("埋头苦干,写程序"); break; case "周二": System.out.println("请求学长帮忙解决bug"); break; case "周三": System.out.println("今晚烧烤、小龙虾"); break; case "周四": System.out.println("帮助学妹解决bug"); break; case "周五": System.out.println("今晚吃鸡"); break; case "周六": System.out.println("上GitHub交友"); break; case "周日": System.out.println("郁郁寡欢、准备上课"); default: System.out.println("输入错误"); } } }
【注意事项】:
- 多个
case
后的常量值不可以重复 switch
的括号内只能是以下类型的表达式:
- 基本类型:byte、char、short、int,注意不能是long类型
- 引用类型:String常量串、枚举类型
break
不要遗漏, 否则会失去 “多分支选择” 的效果
int day = 1; switch(day) { case 1: System.out.println("星期一"); // break; case 2: System.out.println("星期二"); break; } // 运行结果 星期一 星期二
switch
不能表达复杂的条件
// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe // 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示. if (num > 10 && num < 20) { System.out.println("hehe"); }
switch
虽然支持嵌套, 但是很丑,一般不推荐
public class Test { public static void main(String[] args) { int x = 1; int y = 1; switch(x) { case 1: switch(y) { case 1: System.out.println("hehe"); break; } break; case 2: System.out.println("haha"); break; } } }
综上, 我们发现, switch
的使用局限性是比较大的
3. 循环结构
循环结构它是在满足条件的情况下,反复执行某一段代码的计算过程。
举例:
我们要围着操场跑 5 圈,跑圈这个行为就重复了 5 次,也就是循环了 5 次。
3.1 while 语句
基本格式:
while (循环条件) { // 语句 }
执行流程:
首先执行判断表达式,表达式的值为false
,循环直接结束;表达式的值为true
,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
代码示例:打印1~10的值
public class Test { public static void main(String[] args) { int i = 1; while (i <= 10) { System.out.println(i); i++; } } }
3.2 for 语句
基本格式:
for (表达式1;表达式2;表达式3) { // 语句 }
表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整
执行流程:
首先执行表达式1
初始化循环变量,接下来就是执行表达式2
的判断部分,表达式2
的结果如果为false
,则循环结束;如果表达式2
的结果为true
,则执行循环语句,循环语句执行完后,再去执行表达式3
,调整循环变量,然后再去表达式2
的地方执行判断,表达式2
的结果是否为false
,决定循环是否继续。
整个循环的过程中,表达式1
初始化部分只被执行1次,剩下的就是表达式2
、循环语句、表达式3
在循环
代码示例:打印1~10的值
public class Test { public static void main(String[] args) { for (int i = 1; i <= 10; i++) { System.out.println(i); } } }
3.3 do…while循环
基本格式:
do{ 语句 }while(表达式);
while
和 for
这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而do...while
循环则是先直接进入循环体,执行循环内部,然后在执行 while
后的判断表达式,表达式为真,就会进行下一次,表达式为false
,则不再继续循环。
执行流程:
在do...while
循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,在判断表达式的结果是true
,则继续循环,执行循环;判断表达式的结果false
,则循环结束。
所以在do...while
语句中循环体是至少执行一次的,这是do...while
循环比较特殊的地方。
代码示例:打印1~10的值
public class Test { public static void main(String[] args) { int i = 1; do { System.out.println(i); i++; } while (i <= 10); } }
3.4 while语句 和 for语句的对比
4. break和continue
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环。
break
的作用是用于永久的终止循环,只要break
被执行,直接就会跳出循环,继续往后执行。
代码示例:找到100~200之间的第一个3的倍数
public class Test { public static void main(String[] args) { for (int num = 100; num <= 200; num++) { if (num % 3 == 0) { System.out.println(num); break; } } } } // 运行结果 102
continue
的作用是跳出本次循环continue
后边的代码
代码示例:找到100~200中的所有3的倍数
public class Test { public static void main(String[] args) { for (int num = 100; num <= 200; num++) { if (num % 3 == 0){ System.out.println(num); continue; } } } }