# 【选择结构】
##### 今日复习指南
~~~
1.if语句(1个小时内完成,80%的内容搞定,switch的重要程度比if要低):
(1)第一种格式:Demo01If.java
(2)第二种格式:Demo04IfElseMax.java 获取两个int数字最大值
(3)第三种格式:Demo03IfElseIfElseScore.java 判断成绩的区间,给出奖励的
2.switch语句(半个小时内完成,20%的内容搞定):
Demo02SwitchMonth.java 练习根据数字判断输出月份
~~~
##### 今日内容
~~~
顺序结构【了解】
选择结构之if【重点之重点:应用】
选择结构之switch【重点:应用】
修改类/包的名称:
1.右键/Refactor/Rename
2.快捷键: shift + f6
3.直接修改class关键字后面的名称,alt+回车-->Rename file
创建包/类/模块的快捷键: alt + insert
有的笔记本电脑insert键位的使用需要按住fn键
有的笔记本电脑上的insert键被简写成ins
自动补全代码: ctrl + shift + 回车
向下换行: shift + 回车
向上换行: ctrl + alt + 回车
~~~
## 第一章 流程控制
##### 1.1 流程控制分类
~~~
流程:简单来讲所谓流程就是完成一件事情的多个步骤组合起来就叫做一个流程
注意: 在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。
举例:
现在你正在学习Java基础课程
流程: 学习Java的想法 --> 网站和咨询老师沟通 --> 安排课程 --> 听课
流程控制语句分类
1.顺序结构: 按照代码的书写顺序从上到下依次执行
2.选择结构:
(1)if语句【重点的重点】
(2)switch语句【重点】
3.循环结构:
(1)for循环【重点的重点】
(2)while循环【重点】
(3)do-while循环【了解】
~~~
##### 1.2 顺序结构
~~~
public class DemoSequence {
public static void main(String[] args) {
System.out.println("开始....");
System.out.println("今天天气不错,挺风和日丽的....1");
System.out.println("我们上午黑马java直播课....2");
System.out.println("这的确挺爽的....3");
System.out.println("结束....");
}
}
~~~
## 第二章 选择结构-if【重点】
##### 2.1 if语句的第一种格式介绍
~~~
英文单词if是: 如果的意思
1.if语句的第一种格式:
if(布尔表达式) {
语句体;
}
其它语句;
2.执行流程:
(1)计算if语句()中布尔表达式的结果,看是true,还是false
(2)如果if语句()中布尔表达式的结果是true,执行if语句()后{}中的语句体,紧接着执行其它语句
(3)如果if语句()中布尔表达式的结果是false,不执行if语句()后{}中的语句体,直接执行其它语句
3.注意:
(1)if语句的第一种格式,适用于有一种情况的场景
(2)if后面()中的表达式,不管多么复杂,也不管多么简单,结果必须是布尔类型
(3)if后面{}中的语句体,要么被执行,要么被跳过
(4)if后面{}中的语句体: 一条或者多条语句
(5)if语句后面()和{}之间没有分号
(6)if语句后面的{}中如果只有一条语句,那么{}可以省略,但是建议初学者保留
~~~
##### 图解:
![](https://img.kancloud.cn/f7/d5/f7d595122655d26327ea26411bcc2fee_839x416.png)
##### 2.2 if语句的第一种格式练习
~~~
练习
需求1:判断a和b的值是否相等,如果相等,就在控制台输出:a等于b
需求2:判断a和c的值是否相等,如果相等,就在控制台输出:a等于c
public class Demo01If {
public static void main(String[] args) {
System.out.println("开始....");
//定义2个int变量a和b,并初始化
int a = 10;
int b = 20;
//使用if语句第一种格式判断a和b的值是否相同
if(a == b) {
System.out.println(a+"等于"+b);
}
//使用if语句第一种格式判断a和b的值是否不相同
if (a != b) {
System.out.println(a+"不等于"+b);
}
//定义1个int变量c,并初始化
int c = 10;
//使用if语句第一种格式判断a和c的值是否相同
if(a == c) {
System.out.println(a+"等于"+c);
}
//使用if语句第一种格式判断a和c的值是否不相同
if(a != c) {
System.out.println(a+"不等于"+c);
}
System.out.println("结束....");//模拟其它语句
}
}
~~~
##### 2.3 if语句的第二种格式介绍
~~~
英文单词if是: 如果的意思
英文单词else是: 否则的意思
1.if语句的第二种格式:
if(布尔表达式) {
语句体1;
} else {
语句体2;
}
其它语句;
2.执行流程:
(1)计算if语句()中布尔表达式的结果,看是true,还是false
(2)如果if语句()中布尔表达式的结果是true,执行if后面{}中的语句体1,接着执行其它语句
(3)如果if语句()中布尔表达式的结果是false,执行else后面{}中的语句体2,接着执行其它语句
3.注意:
(1)if语句的第二种格式,适用于有两种情况的场景
(2)if后面()中的表达式,不管多么复杂,也不管多么简单,结果必须是布尔类型
(3)语句体1和语句体2,只能有一个被执行,是一个二选一的情况,是一个是与否的情况
(4)if和else后面{}中的语句体: 一条或者多条语句
(5)if语句后面()和{}之间没有分号,而且else 和 {}之间也没有分号
(6)if语句后面的{}中如果只有一条语句,那么{}可以省略,但是建议初学者保留
~~~
##### 图解:
![](https://img.kancloud.cn/47/1e/471ea5064c4b0ebb9a14957b6ce762d6_920x429.png)
##### 2.4 if语句的第二种格式练习判断大小
~~~
需求:
判断a是否大于b,如果是,在控制台输出:a的值大于b,否则,在控制台输出:a的值不大于b
实现步骤:
1.定义2个int变量a和b,并初始化
2.因为有两种输出结果,所以使用if语句第二种格式对a和b的大小进行判断,并输出不同的结果
public class Demo02IfElse {
public static void main(String[] args) {
System.out.println("开始....");
//1.定义2个int变量a和b,并初始化
int a = 30, b = 20;
//2.因为有两种输出结果,所以使用if语句第二种格式对a和b的大小进行判断,并输出不同的结果
//30>20:true
if(a > b) {
System.out.println(a+"的值大于"+b);
} else {
System.out.println(a+"的值不大于"+b);
}
System.out.println("结束....");//模拟其它语句
}
}
~~~
##### 2.5 if语句的第二种格式练习判断奇偶数
~~~
需求:
任意给出一个整数,请用程序实现判断该整数是奇数还是偶数,并在控制台输出该整数是奇数还是偶数。
实现步骤:
1.创建键盘录入Scanner类的对象(1.导包 2.创建)
2.获取键盘录入的一个整数数字,保存到int变量num中
3.使用if语句的第二种格式,判断num中数字的奇偶性,并输出不同的结果
(1)偶数: num%2==0
(2)奇数: num%2!=0
public class Demo03IfElseJiOu {
public static void main(String[] args) {
System.out.println("开始....");
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的一个整数数字,保存到int变量num中
System.out.println("请您输入一个整数数字: ");
int num = sc.nextInt();
//3.使用if语句的第二种格式,判断num中数字的奇偶性,并输出不同的结果
//把判断num是偶数作为条件
/*if (num % 2 == 0) {
System.out.println(num+"是一个偶数数字");
} else {
System.out.println(num+"是一个奇数数字");
}*/
//把判断num是奇数作为条件
if(num%2 != 0) {
System.out.println(num+"是一个奇数数字");
} else {
System.out.println(num+"是一个偶数数字");
}
System.out.println("结束....");//模拟其它语句
}
}
~~~
~~~
需求:
任意给出两个整数,请用程序实现求出两个整数的最大值,并输出到控制台。
实现步骤:
1.创建键盘录入Scanner类的对象(1.导包 2.创建)
2.获取键盘录入的两个个整数数字,保存到两个int变量a和b中
3.定义int变量max,作用保存两个数字的最大值的
4.使用if语句第二种格式计算a和b的最大值,保存到变量max中
5.打印max的值
public class Demo04IfElseMax {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的两个个整数数字,保存到两个int变量a和b中
System.out.println("请输入第一个整数数字: ");
int a = sc.nextInt();
System.out.println("请输入第二个整数数字: ");
int b = sc.nextInt();
//3.定义int变量max,作用保存两个数字的最大值的
int max;
//4.使用if语句第二种格式计算a和b的最大值,保存到变量max中
if (a > b) {//a > b: true 说明a是最大的
//把变量a中的值,赋值给变量max
max = a;
} else {//a > b: false 说明b是最大的
//把变量b中的值,赋值给变量max
max = b;
}
//5.打印max的值
System.out.println(a+"和"+b+"的最大值是: "+max);
}
}
~~~
##### 图解分析:
![](https://img.kancloud.cn/65/b1/65b1826cbacf600cb3a8634d185d868a_1302x522.png)
##### 2.6 if语句的第三种格式介绍
~~~
英文单词if是: 如果的意思
英文单词else是: 否则的意思
1.if语句的第三种格式:
if(布尔表达式1) {
语句体1;
} else if(布尔表达式2) {
语句体2;
}
...
else if(布尔表达式n) {
语句体n;
} else {
语句体n+1;
}
其它语句;
2.执行流程:
(1)首先计算布尔表达式1的值
(2)如果值为true就执行语句体1;如果值为false就计算布尔表达式2的值
(3)如果值为true就执行语句体2;如果值为false就计算布尔表达式3的值
(4)...
(5)如果没有任何布尔表达式为true,就执行语句体n+1。
3.注意:
(1)if语句的第三种格式,适用于有多种情况(至少两种以上)的场景
(2)if后面()中的表达式,不管多么复杂,也不管多么简单,结果必须是布尔类型
(3)语句体1到语句体n+1,只能有一个被执行,是一个多选一的情况
(4)if和else后面{}中的语句体: 一条或者多条语句
(5)if语句后面()和{}之间没有分号,而且else 和 {}之间也没有分号
(6)if语句后面的{}中如果只有一条语句,那么{}可以省略,但是建议初学者保留
(7)只能在if后面写条件,没有if就不能写条件,不能直接在else后面写(条件)
(8)最后一个else后面没有if,是用来兜底的
如果上面的所有的if都不成立,就执行最后一个else中{}中的代码
~~~
图解:
![](https://img.kancloud.cn/0a/9d/0a9df8078c208c89797a8b4d92efbee3_1191x478.png)
##### 2.7 if语句的第三种格式练习根据数字输出对应的星期
~~~
需求:
键盘录入一个星期数(1,2,...7),输出对应的星期一,星期二,...星期日
演示效果:
输入 1 输出 星期一
输入 2 输出 星期二
输入 3 输出 星期三
输入 4 输出 星期四
输入 5 输出 星期五
输入 6 输出 星期六
输入 7 输出 星期日
输入 其它数字 输出 数字有误
实现步骤:
1.创建键盘录入Scanner类的对象(1.导包 2.创建)
2.获取键盘录入的1-7之间的一个整数数字(代表星期数),保存到一个int变量week中
3.因为week中的数字有7+1中情况,所以使用if语句第三种格式对week中的数据进行判断,并输出不同的结果
public class Demo01IfElseIfElseWeek {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的1-7之间的一个整数数字(代表星期数),保存到一个int变量week中
System.out.println("请输入一个1到7之间的整数数字(代表星期数): ");
int week = sc.nextInt();
//3.因为week中的数字有7+1中情况,所以使用if语句第三种格式对week中的数据进行判断,并输出不同的结果
if(week == 1) {
System.out.println("星期一");
} else if(week == 2) {
System.out.println("星期二");
} else if(week == 3) {
System.out.println("星期三");
} else if(week == 4) {
System.out.println("星期四");
} else if(week == 5) {
System.out.println("星期五");
} else if(week == 6) {
System.out.println("星期六");
} else if(week == 7) {
System.out.println("星期日");
} else /*if(week<1 || week>7)*/ {//隐藏条件: week<1 || week >7
System.out.println("您输入的代表星期数的数字: "+week
+" 是不存在的,哥屋恩...");
}
System.out.println("结束....");
}
}
public class Demo02IfElseIfElseWeek {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的1-7之间的一个整数数字(代表星期数),保存到一个int变量week中
System.out.println("请输入一个1到7之间的整数数字(代表星期数): ");
int week = sc.nextInt();
//3.因为week中的数字有7+1中情况,所以使用if语句第三种格式对week中的数据进行判断,并输出不同的结果
//排除非法数据
if(week<1 || week>7) {
System.out.println("您输入的代表星期数的数字: "+week
+" 是不存在的,哥屋恩...");
} else if(week == 1) {//代码只要执行到这里说明: week>=1 && week<=7
System.out.println("星期一");
} else if(week == 2) {
System.out.println("星期二");
} else if(week == 3) {
System.out.println("星期三");
} else if(week == 4) {
System.out.println("星期四");
} else if(week == 5) {
System.out.println("星期五");
} else if(week == 6) {
System.out.println("星期六");
} else/*if(week == 7)*/ {//隐藏条件: week == 7
System.out.println("星期日");
}
System.out.println("结束....");
}
}
~~~
##### 2.8 if语句的第三种格式练习根据成绩进行奖励
~~~
需求:
小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,
假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
奖励规则:
95~100 山地自行车一辆 包含95和100的 数学中[95,100] 表示95到100之间,包含95,包含100
90~94 游乐场玩一次 包含90和94的 数学中(95,100) 表示95到100之间,不包含95,不包含100
80~89 变形金刚玩具一个 包含80和89的
80以下 胖揍一顿 不包含80分的
实现步骤:
1.创建键盘录入Scanner类的对象(1.导包 2.创建)
2.获取键盘录入的一个0到100之间的整数数字代表成绩,保存到int变量score中
3.因为score中的数字有4+1中情况,所以使用if语句第三种格式对score中的数据进行判断,并输出不同的结果
public class Demo03IfElseIfElseScore {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的一个0到100之间的整数数字代表成绩,保存到int变量score中
System.out.println("请输入0到100之间的整数数字(代表成绩): ");
int score = sc.nextInt();
//3.因为score中的数字有4+1中情况,所以使用if语句第三种格式对score中的数据进行判断,并输出不同的结果
if(score>=95 && score<=100) {
System.out.println("奖励山地自行车一辆");
} else if(score>=90 && score<=94) {
System.out.println("奖励游乐场玩一次");
} else if (score >= 80 && score <= 89) {
System.out.println("奖励变形金刚玩具一个");
} else if(score>=0 && score<80 ) {
System.out.println("奖励胖揍一顿");
} else /*if(score<0 || score>100)*/ {//隐藏条件: score<0 || score>100
System.out.println("您输入的成绩是非法的,哥屋恩....");
}
System.out.println("结束...");
}
}
public class Demo04IfElseIfElseScore {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的一个0到100之间的整数数字代表成绩,保存到int变量score中
System.out.println("请输入0到100之间的整数数字(代表成绩): ");
int score = sc.nextInt();
//3.因为score中的数字有4+1中情况,所以使用if语句第三种格式对score中的数据进行判断,并输出不同的结果
//判断非法数据
if(score<0 || score>100) {
System.out.println("您输入的成绩是非法的,哥屋恩....");
} else if(score>=95 && score<=100) {//执行到这个位置: score>=0 && score<=100
System.out.println("奖励山地自行车一辆");
} else if(score>=90 && score<=94) {
System.out.println("奖励游乐场玩一次");
} else if (score >= 80 && score <= 89) {
System.out.println("奖励变形金刚玩具一个");
} else /*if(score>=0 && score<80 )*/ {//隐藏条件: score>=0 && score<80
System.out.println("奖励胖揍一顿");
}
System.out.println("结束...");
}
}
~~~
##### 图解:
![](https://img.kancloud.cn/7b/b1/7bb194fbe1a9d3f42ae96aa7e9adf790_1327x518.png)
## 第三章 选择结构-switch【重点】
##### 3.1 switch语句格式和介绍
~~~
1.switch语句的格式:
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
breeak;
...
case 常量值n:
语句体n;
break;
default:
语句体n+1;
break;
}
其它语句;
2.执行流程:
(1)首先计算出表达式的值
(2)其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
(3)最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
3.注意事项:
(1)switch后面()中表达式的数据类型,只能是以下几种类型:
byte/short/char/int String/枚举
(2)break: 作用是用来结束switch的,只要执行break,直接从switch语句中跳出来,
执行switch语句后续的其它代码
(3)case后面只能写常量,而且不能重复
(4)如果所有的case和default后面的都有break,那么case和default的书写顺序无所谓
(5)default也是用来兜底的,如果所有case中常量值和表达式的值都不相同,直接执行default中的代码
(6)如果default写在了最后,则可以省略default中的break
~~~
##### 执行流程
![](https://img.kancloud.cn/ef/a3/efa31530f5f75692574d14644dc685d1_1085x471.png)
~~~
public class Demo01Switch {
public static void main(String[] args) {
int num = 2;
switch (num) {
case 1:
System.out.println("你好");
break;
case 2:
System.out.println("我好");
break;
case 3:
System.out.println("大家好,才是真的好");
break;
default:
System.out.println("他/她好,我也好");
//break;
}
System.out.println("结束....");
}
}
~~~
##### 3.2 switch练习根据月份输出对应的季节
~~~
需求:
一年有12个月,分属于春夏秋冬4个季节,
键盘录入一个月份,请用程序实现判断该月份属于哪个季节,并输出。
演示效果
输入: 1、2、12 输出:冬季
输入: 3、4、5 输出:春季
输入: 6、7、8 输出:夏季
输入: 9、10、11 输出:秋季
输入: 其它数字 输出:数字有误
实现步骤(本案例使用switch):
1.创建键盘录入Scanner类的对象(1.导包 2.创建)
2.获取键盘录入的1-12之间的一个整数数字(代表月份),保存到int变量month中
3.因为month中的数据有12+1种情况,所以使用switch判断month中的值,根据不同的值输出不同的结果
public class Demo02SwitchMonth {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的1-12之间的一个整数数字(代表月份),保存到int变量month中
System.out.println("请输入一个1-12的整数数字(代表月份): ");
int month = sc.nextInt();
//3.因为month中的数据有12+1种情况,所以使用switch判断month中的值,根据不同的值输出不同的结果
switch (month) {
case 1:
System.out.println("冬季");
break;
case 2:
System.out.println("冬季");
break;
case 12:
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;
case 8:
System.out.println("夏季");
break;
case 9:
System.out.println("秋季");
break;
case 10:
System.out.println("秋季");
break;
case 11:
System.out.println("秋季");
break;
default:
System.out.println("您输入的月份不存在,哥屋恩...");
break;
}
System.out.println("结束....");
}
}
~~~
##### 3.3 使用case穿透优化根据月份输出对应的季节的案例
~~~
使用case穿透优化根据月份输出对应的季节的案例
发现问题:
前面Demo02SwitchMonth.java文件中出现了大量的重复的代码
1,2,12代码重复,3,4,5代码重复,6,7,8代码重复,9,10,11代码重复
每三个case中的代码都是相同的
解决方案使用case穿透:
如果多个连续的case中具有相同的代码和break,可以只保留最后一个case的代码和break,前面的多个case中的代码和break省略不写
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后
运行,直到遇到break,或者整体switch结束。
执行步骤:
(1)找到case入口: 常量值和表达式值相同的那个case
(2)从case入口进来执行代码,只要当前case代码中没有break,直接穿透进入下一个case(不会再判断常量值和表达式结果是否相同)中的代码执行,直到遇到break,才会结束switch语句
public class Demo03SwitchMonthBetter {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象(1.导包 2.创建)
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的1-12之间的一个整数数字(代表月份),保存到int变量month中
System.out.println("请输入一个1-12的整数数字(代表月份): ");
int month = sc.nextInt();
//3.因为month中的数据有12+1种情况,所以使用switch判断month中的值,根据不同的值输出不同的结果
switch (month) {//3
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("您输入的月份不存在,哥屋恩...");
break;
}
System.out.println("结束....");
}
}
~~~
## 总结
~~~
能够使用if语句完成获取两个数中较大值
int a = 10, b = 20;//可以使用键盘录入
//定义int变量max,保存最大值的
int max;
//使用if-else对于a和b的大小进行判断
if(a>b) {
max = a;
} else {
max = b;
}
能够使用if语句完成根据分数输出对应级别
举例:
[95,100] "卓越"
[90,95) "优秀"
[80,90) "良好"
[70,80) "一般"
[60,70) "及格"
[0,60) "不及格"
其它情况 "数字错误"
int score = ...;//可以使用键盘录入
if(score>=95 && score<=100) {
sout("卓越");
} else if(score>=90 && score<95) {
sout("优秀");
} else if(score>=80 && score<90) {
sout("良好");
} else if(score>=70 && score<80) {
sout("一般");
} else if(score>=60 && score<70) {
sout("及格");
} else if(score>=0 && score<60) {
sout("不及格");
} else {//隐藏条件: score<0 || score>1000 不用单独加if写条件了
sout("数字错误");
}
能够使用switch语句完成根据月份输出对应季节
int month = ...;//可以使用键盘录入
switch(month) {
case 1:
sout("冬季");
break;
case 2:
sout("冬季");
break;
case 12:
sout("冬季");
break;
//...
default :
sout("数字错误");
break;
}
~~~