前言:流程控制语句
-
什么是流程控制语句
-
流程控制语句:可以控制程序的执行流程。
-
-
流程控制语句的分类
-
顺序结构
-
选择结构
-
循环结构
-
-
执行流程:
-
-
案例演示
-
输出几句话看效果即可
-
class Demo1_Sequence { //sequence 顺序 public static void main(String[] args) { System.out.println("Hello World!11111"); System.out.println("Hello World!3333"); System.out.println("Hello World!22222"); System.out.println("Hello World!44444"); } }
-
1. 选择结构
1.1 选择结构if语句
-
选择结构的分类
-
if语句
-
switch语句
-
-
if语句有几种格式
-
格式1
- if (比较表达式) { 语句体; }
-
/* * C:if语句的格式1 * if(比较表达式) { 语句体; } * D:执行流程: * 先计算比较表达式的值,看其返回值是true还是false。 * 如果是true,就执行语句体; * 如果是false,就不执行语句体; */ class Demo1_If { public static void main(String[] args) { int age = 17; if (age >= 18) { System.out.println("可以浏览本网站"); } System.out.println("完了"); } }
-
格式2
-
if (比较表达式) {
语句体1;
}else {
语句体2;
} -
/* * A:if语句的格式2 * if(比较表达式) { 语句体1; }else { 语句体2; } * B:执行流程: * 首先计算比较表达式的值,看其返回值是true还是false。 * 如果是true,就执行语句体1; * 如果是false,就执行语句体2; * C:案例演示 * a:获取两个数据中较大的值 * b:判断一个数据是奇数还是偶数,并输出是奇数还是偶数 * 注意事项:else后面是没有比较表达式的,只有if后面有。 */ class Demo3_If { public static void main(String[] args) { /*int x = 0; if (x == 1) { System.out.println("男厕所欢迎您"); }else { System.out.println("女厕所欢迎您"); }*/ //a:获取两个数据中较大的值 /*int x = 10; int y = 20; int z; if (x > y) { z = x; }else { z = y; } System.out.println(z);*/ //b:判断一个数据是奇数还是偶数,并输出是奇数还是偶数 int num = 11; if (num % 2 == 0) { System.out.println(num + "是一个偶数"); }else { System.out.println(num + "是一个奇数"); } } }
-
-
格式3
-
if (比较表达式1) {
语句体1;
}else if (比较表达式2) {
语句体2;
}else if (比较表达式3) {
语句体3;
}
...
else {
语句体n+1;
} -
/* * A:if语句的格式3: * if(比较表达式1) { 语句体1; }else if(比较表达式2) { 语句体2; }else if(比较表达式3) { 语句体3; } ... else { 语句体n+1; } * B:执行流程: * 首先计算比较表达式1看其返回值是true还是false, * 如果是true,就执行语句体1,if语句结束。 * 如果是false,接着计算比较表达式2看其返回值是true还是false, * 如果是true,就执行语句体2,if语句结束。 * 如果是false,接着计算比较表达式3看其返回值是true还是false, * 如果都是false,就执行语句体n+1。 * C:注意事项:最后一个else可以省略,但是建议不要省略,可以对范围外的错误值提示 */ class Demo5_If { public static void main(String[] args) { int x = 2; if (x == 1) { System.out.println("男厕所欢迎您"); }else if (x == 0) { System.out.println("女厕所欢迎您"); }else { System.out.println("无法识别您的性别"); } } }
-
-
-
-
-
/* * a:比较表达式无论简单还是复杂,结果必须是boolean类型 * b:if语句控制的语句体如果是一条语句,大括号可以省略; * 如果是多条语句,就不能省略。建议永远不要省略。 * c:一般来说:有左大括号就没有分号,有分号就没有左大括号 */ class Demo2_If { public static void main(String[] args) { int age = 17; if (age >= 18 && age <= 60) { System.out.println("可以浏览本网站"); //int x = 10; 是两句话,int x声明是一句,x = 10 赋值是一句 } System.out.println("完了"); } }
- if语句的格式2和三元的相互转换问题
- if语句和三元运算符完成同一个效果
-
/* * A:案例演示 * if语句和三元运算符完成同一个效果 * B:案例演示 * if语句和三元运算符的区别 * 三元运算符实现的,都可以采用if语句实现。反之不成立。 * 什么时候if语句实现不能用三元改进呢? * 当if语句控制的操作是一个输出语句的时候就不能。 * 为什么呢?因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。 */ class Demo4_If { public static void main(String[] args) { int x = 10; int y = 20; int z; if (x > y) { //z = x; System.out.println(x + "是最大值"); }else { //z = y; System.out.println(y + "是最大值"); } //System.out.println(z); int a = 20; int b = 30; int c = (a > b)? a : b; } }
-
- if语句和三元运算符完成同一个效果
-
-
-
三元运算符实现的,都可以采用if语句实现。反之不成立。
-
-
什么时候if语句实现不能用三元改进呢?
-
当if语句控制的操作是一个输出语句的时候就不能。
-
-
-
- 选择结构if语句的嵌套使用
-
/* * A:案例演示 * 需求:获取三个数据中的最大值 * if语句的嵌套使用。 */ class Demo6_IfIf { public static void main(String[] args) { int a = 40; int b = 50; int c = 30; if (a > b) { if (a > c) { System.out.println(a + "是最大值"); }else { System.out.println(c + "是最大值"); } }else { //b >= a if (b > c) { System.out.println(b + "是最大值"); }else { System.out.println(c + "是最大值"); } } } }
-
1.2 选择结构switch语句
-
switch语句的格式
-
switch (表达式) { //基本数据类型可以接收byte,short,char,int
case 值1: //引用数据类型可以接收枚举(JDK1.5),String字符串(JDK1.7)
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
break; }
-
-
switch语句的格式解释
-
面试题
-
byte可以作为switch的表达式吗?
- 可以。所有计算可以自动补位到int类型的,都可以
-
long可以作为switch的表达式吗?
- 不可以
-
String可以作为switch的表达式吗?
- 1.7版本JDK后可以
-
-
执行流程
-
先计算表达式的值
-
然后和case后面的匹配,如果有就执行对应的语句,否则执行default控制的语句
-
class Demo1_Switch { public static void main(String[] args) { /* * A:switch语句的格式 * int x = 10; switch(表达式) { //基本数据类型可以接收byte,short,char,int case 值1: //引用数据类型可以接收枚举(JDK1.5)String字符串(JDK1.7) 语句体1; break; case 值2: 语句体2; break; … default: 语句体n+1; break; } * B:switch语句的格式解释 * C:面试题 * byte可以作为switch的表达式吗? * long可以作为switch的表达式吗? * String可以作为switch的表达式吗? * C:执行流程 * 先计算表达式的值 * 然后和case后面的匹配,如果有就执行对应的语句,否则执行default控制的语句 */ String name = "rose"; String gender = "女"; switch (gender) { case "男士": System.out.println(name + "是一位" + gender + "喜欢吃饭睡觉打dota"); break; case "女士": System.out.println(name + "是一位" + gender + "喜欢逛街购物美容"); break; default: System.out.println(name + "是一位" + gender + "打雌性激素维持美貌容颜"); break; } } }
-
- 选择结构switch语句的练习
-
整数(给定一个值,输出对应星期几)
-
class Test1_Switch { public static void main(String[] args) { //* A:整数(给定一个值,输出对应星期几) int week = 1; switch (week) { 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; } } }
-
- 选择结构switch语句的注意事项
-
案例演示
-
case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
-
default可以省略吗?
-
可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
-
特殊情况:
-
case就可以把值固定。
-
A,B,C,D
-
-
-
break可以省略吗?
-
最后一个可以省略,其他最好不要省略
-
会出现一个现象:case穿透。
-
最终我们建议不要省略
-
-
default一定要在最后吗?
-
不是,可以在任意位置。但是建议在最后。
-
-
switch语句的结束条件
-
遇到break就结束了
-
执行到switch的右大括号就结束了
-
-
-
- 选择结构switch语句练习
-
看程序写结果:
-
class Test2_Switch { public static void main(String[] args) { // A:看程序写结果: /*int x = 2; int y = 3; switch(x){ default: y++; break; case 3: y++; case 4: y++; } System.out.println("y="+y); // 输出4 */ //B:看程序写结果: int x = 2; int y = 3; switch(x){ default: y++; case 3: y++; case 4: y++; } System.out.println("y="+y); // 输出6 } }
-
省略了break,会出现case穿透现象,导致逻辑出错
-
-
- 选择结构if语句和switch语句的区别
-
总结switch语句和if语句的各自使用场景
-
switch建议判断固定值的时候用
-
if建议判断区间或范围的时候用
-
-
案例演示
-
分别用switch语句和if语句实现下列需求:
-
键盘录入月份,输出对应的季节
-
import java.util.Scanner; class Test3_SwitchIf { public static void main(String[] args) { /* * 键盘录入月份,输出对应的季节 一年有四季 3,4,5春季 6,7,8夏季 9,10,11秋季 12,1,2冬季 */ Scanner sc = new Scanner(System.in); //创建键盘录入对象 System.out.println("请输入月份"); int month = sc.nextInt(); //将键盘录入的结果存储在month /*switch (month) { case 3: case 4: case 5: System.out.println(month + "月是春季"); break; case 6: case 7: case 8: System.out.println(month + "月是夏季"); break; case 9: case 10: case 11: System.out.println(month + "月是秋季"); break; case 12: case 1: case 2: System.out.println(month + "月是冬季"); break; default: System.out.println("对不起没有对应的季节"); break; }*/ //用if语句来完成月份对应季节 if (month > 12 || month < 1) { System.out.println("对不起没有对应的季节"); }else if (month >= 3 && month <= 5) { System.out.println(month + "月是春季"); }else if (month >= 6 && month <= 8) { System.out.println(month + "月是夏季"); }else if (month >= 9 && month <= 11) { System.out.println(month + "月是秋季"); }else { System.out.println(month + "月是冬季"); } } }
-
-
-
2. 循环结构
2.1 循环结构概述
-
循环结构的分类
-
for
-
while
-
do...while
-
2.2 循环结构——for语句
- 格式:
-
for (初始化表达式;条件表达式;循环后的操作表达式) {
循环体;
}
-
-
执行流程:
-
执行初始化语句
-
执行判断条件语句,看其返回值是true还是false
-
如果是true,就继续执行
-
如果是false,就结束循环
-
-
执行循环体语句;
-
执行循环后的操作表达式 (在循环体执行完成后,执行 i++,或 i--)
-
回到执行判断条件语句,看其返回值是true还是false
-
-
案例演示
-
在控制台输出10次"helloworld"
-
/* * A:循环结构的分类 * for,while,do...while * B:循环结构for语句的格式: * for(初始化表达式;条件表达式;循环后的操作表达式) { 循环体; } * C执行流程: * a:执行初始化语句 * b:执行判断条件语句,看其返回值是true还是false * 如果是true,就继续执行 * 如果是false,就结束循环 * c:执行循环体语句; * d:执行循环后的操作表达式 * e:回到B继续。 * D:案例演示 * 在控制台输出10次"helloworld" */ class Demo1_For { 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");*/ for (int i = 1;i <= 10 ;i++ ) { System.out.println(i + " helloworld"); } } }
-
-
案例演示
-
需求:请在控制台输出数据1-10
-
需求:请在控制台输出数据10-1
-
/* * A:案例演示 * 需求:请在控制台输出数据1-10 * 需求:请在控制台输出数据10-1 * B:注意事项 * a:判断条件语句无论简单还是复杂结果是boolean类型。 * b:循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。 * c:一般来说:有左大括号就没有分号,有分号就没有左大括号 */ class Test1_For { public static void main(String[] args) { for (int i = 1;i <= 10 ;i++ ){ System.out.println("i = " + i); } System.out.println("-----------------------"); for (int i = 10;i >= 1 ;i-- ) { System.out.println("i = " + i); } } }
-
-
注意事项
-
判断条件语句无论简单还是复杂结果是boolean类型。
-
循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
-
一般来说:有左大括号就没有分号,有分号就没有左大括号
-
-
案例演示
-
需求:求出1-10之间数据之和
-
需求:求出1-100之间偶数和
-
需求:求出1-100之间奇数和
-
/* * A:案例演示 * 需求:求出1-10之间数据之和 * B:学生练习 * 需求:求出1-100之间偶数和 * 需求:求出1-100之间奇数和 分析:1-10数据的和 0 + 1 1 + 2 3 + 3 6 ... */ class Test2_For { public static void main(String[] args) { //1-10的和 /*int sum = 0; for (int i = 1;i <= 10 ;i++ ) { sum = sum + i; } System.out.println("sum = " + sum);*/ //1-100的偶数和 /*int sum = 0; for (int i = 1;i <= 100 ;i++ ) { if (i % 2 == 0) { sum = sum + i; } } System.out.println("sum = " + sum);*/ //1-100的奇数和 int sum = 0; for (int i = 1;i <= 100 ;i+=2 ) { /*if (i % 2 != 0) { sum = sum + i; }*/ sum = sum + i; } System.out.println("sum = " + sum); } }
-
-
“水仙花数”案例演示
-
需求:在控制台输出所有的”水仙花数”
-
所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
-
举例:153就是一个水仙花数。
-
153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
-
-
/* * A:案例演示 * 需求:在控制台输出所有的”水仙花数” * 所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。 * 举例:153就是一个水仙花数。 * 153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153 分析: 1,100 - 999 2,获取每一个位数的值,百位,十位,个位 3,判断各个位上的立方和是否等于这个数,如果等于打印 */ class Test3_Flower { public static void main(String[] args) { for (int i = 100;i <= 999 ;i++ ) { //获取100到999之间的数 int ge = i % 10; //123 % 10 int shi = i / 10 % 10; //12 % 10; int bai = i / 10 / 10 % 10; //1 % 10 if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) { System.out.println(i); } } } }
-
2.3 循环结构——while语句
- 循环结构while语句的格式:
-
while循环的基本格式:
while (判断条件语句) {
循环体语句;
} - 完整格式:
-
初始化语句;
while (判断条件语句) {
循环体语句;
控制条件语句;
}
-
-
- 执行初始化语句
-
执行判断条件语句,看其返回值是true还是false
-
如果是true,就继续执行
-
如果是false,就结束循环
-
-
执行循环体语句;
-
执行控制条件语句
-
- 案例演示
- 需求:请在控制台输出数据1-10
-
/* * A:循环结构while语句的格式: * while循环的基本格式: while(判断条件语句) { 循环体语句; } 完整格式: 初始化语句; while(判断条件语句) { 循环体语句; 控制条件语句; } * B:执行流程: * a:执行初始化语句 * b:执行判断条件语句,看其返回值是true还是false * 如果是true,就继续执行 * 如果是false,就结束循环 * c:执行循环体语句; * d:执行控制条件语句 * e:回到B继续。 * C:案例演示 * 需求:请在控制台输出数据1-10 */ class Demo1_While { public static void main(String[] args) { int x = 1; while (x <= 10) { System.out.println("x = " + x); x++; } } }
- 案例演示
- 求和:求1-100的和
- 统计:统计水仙花数 有多少个
-
class Test1_While { public static void main(String[] args) { /* * A:求和思想 * 求1-100之和 * B:统计思想 * 统计”水仙花数”共有多少个 */ //求1-100之和 /*int sum = 0; int i = 1; while (i <= 100) { sum += i; //sum = sum + i; i++; //让变量i自增 } System.out.println("sum = " + sum);*/ //统计”水仙花数”共有多少个 int count = 0; //计数器 int i = 100; while (i <= 999) { int ge = i % 10; int shi = i / 10 % 10; int bai = i / 100; if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai) { count ++; } i++; } System.out.println("count =" + count); //某屌丝为了追求女神,写了一段代码示爱,但是女神也会java,改动一下把屌丝拒绝 int j = 1; while (j <= 10000) { System.out.println("I Love You!!!"); j++; } } }
2.4 循环结构——do...while语句
- 循环结构do...while语句的格式:
-
初始化语句;
do {
循环体语句;
控制条件语句;
}while(判断条件语句);
-
-
-
执行初始化语句
-
执行循环体语句;
-
执行控制条件语句
-
执行判断条件语句,看其返回值是true还是false
-
如果是true,就继续执行
-
如果是false,就结束循环
-
-
-
-
class Test { public static void main(String[] args) { int i = 0; do { System.out.println(i); i++; } while (i < 11); } }
2.5 三种循环语句的区别
-
-
do...while循环至少执行一次循环体。
-
-
class Demo1_DoWhile { public static void main(String[] args) { //while 和do while的区别 int i = 11; do { System.out.println("i = " + i); i++; } while (i <= 10); // 条件不成立,但是循环体先执行,故至少执行一次循环体 System.out.println("---------------------"); int j = 11; while (j <= 10) { System.out.println("j = " + j); j++; } //条件不成立,不执行 } }
-
-
- 如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用谁就用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。
- 例如:
-
class Demo1_DoWhile { public static void main(String[] args) { for (int i = 1;i <= 10 ;i++ ) { System.out.println("i = " + i); } //System.out.println("i = " + i); for语句执行后变量会被释放,不能再使用 System.out.println("-------------------"); int i = 1; while (i <= 10) { System.out.println("i = " + i); i++; } System.out.println("-------------------"); System.out.println("i = " + i); //while语句执行后,初始化变量还可以继续使用*/ } }
-
- 例如:
- 如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用谁就用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。
2.6 死循环
-
-
两种最简单的死循环格式
-
while(true){...}
-
-
class Demo1_DoWhile { public static void main(String[] args) { //while语句的无限循环 while (true) { System.out.println("hello world"); } //System.out.println("hello world"); //for语句的无限循环 for (; ; ) { System.out.println("hello world"); } } }
-
2.7 循环嵌套
- 打印4行5列的星星
-
/* * A:案例演示 * 需求:请输出一个4行5列的星星(*)图案。 * 如图: ***** ***** ***** ***** 注意: System.out.println("*");和System.out.print("*");的区别 * B:结论: * 外循环控制行数,内循环控制列数 */ class Demo1_ForFor { public static void main(String[] args) { /*for (int i = 1;i <= 3 ;i++ ) { //外循环 System.out.println("i = " + i); for (int j = 1;j <= 3 ;j++ ) { //内循环 System.out.println("j = " + j); } }*/ for (int i = 1;i <= 4 ;i++ ) { //外循环决定的是行数 for (int j = 1;j <= 5 ;j++ ) { //内循环决定的是列数 System.out.print("*"); } System.out.println(); } } } /* ***** ***** ***** ***** */
- 结论:
- 外循环控制行数,内循环控制列数
-
- 请输出下列的形状
-
/* 需求:请输出下列的形状 * ** *** **** ***** */ class Demo2_ForFor { public static void main(String[] args) { for (int i = 1;i <= 5 ; i++) { //外循环决定行数 for (int j = 1;j <= i ;j++ ) { //内循环决定列数 System.out.print("*"); } System.out.println(); //将光标换到下一行的行首 } } }
-
- 九九乘法表
-
class Test { public static void main(String[] args) { for (int i = 1;i < 10; i++ ) { for (int j = 1; j <= i ; j++ ) { System.out.print(j+"*"+i+"="+(i * j)+" "); } System.out.println(); } } }
-
2.8 控制跳转语句——break语句,continue语句,标号,return语句
- break语句
- 只能在switch和循环中
- continue语句
- 只能在循环中
- 控制跳转语句标号
-
class Demo3_Mark { //mark 标记 public static void main(String[] args) { outer: for (int i = 1;i <= 10 ;i++ ) { //outer,inner就是标号,只要是合法的标识符即可 System.out.println("i = " + i); inner: for (int j = 1;j <= 10 ;j++ ) { System.out.println("j = " + j); break outer; } } } }
- 标号的格式就是 合法的标识符 加上“:”
- outer:
- inner:
- a:
- http:
- this:
-
return的作用
-
返回
-
其实它的作用不是结束循环的,而是结束方法的。
-
-
-
案例演示
-
return和break以及continue的区别?
-
return是结束方法
-
break是跳出循环
-
continue是终止本次循环继续下次循环
-
-
-