例1:比如你去医院检查,医生给你测心跳,这个心跳数据呢,会录入到医院的系统里,然后判断你的心跳有没有超过正常指标,如果超过,就视为不正常;没超过或者刚刚好,就是正常的。
例2:比如发微信红包给别人的时候,微信会判断你的钱包额度够不够发这个额度的红包,如果够,就可以发出;如果不够,就不能发。
if:如果的意思
格式1:
if (条件表达式) {
语句体;
}
格式2:
if (条件表达式) {
语句体1;
}else {
语句体2;
}
格式3:
if (条件表达式1) {
语句体1;
}else if (条件表达式2) {
语句体2;
}else if (条件表达式3) {
语句体3;
}
......
else {
语句体n+1;
}
package com.app.branch;
/**
目标:学会使用if分支结构解决问题,理解其流程
*/
public class IfDemo1 {
public static void main(String[] args) {
// 需求:心跳(60~100)之间是正常的,否则系统提示进一步检查
System.out.println("-----------------if格式1-----------------");
/*
分析需求:
1.定义一个病人名字,测试的心跳频率
2.使用if分支结构的格式1来判断该病人心跳是否在 60~100 之间;
心跳异常返回:姓名 + 先生,您的心跳数据是:?,需进一步检查!
3. 格式1:if (条件表达式) {代码块...}
*/
// 1.定义一个病人名字,测试的心跳数据
String patientName = "刘备"; // 病人
// 异常心跳
int heartRate = 30; // 用于测试 if分支结构
// 正常心跳
int heartRate2 = 80; // 用于测试 if分支结构
System.out.println("测试病人心跳数据异常时:");
System.out.println("开始检查...");
//2.使用if分支结构的 格式1 来判断心跳数据是否小于60,或者大于100,如果是true,就为异常
if (heartRate < 60 || heartRate > 100) { // if判断心跳数据是否小于60,或者大于100
// 判断结果为true,发现病人的心跳数据异常,需进一步检查
System.out.println(patientName + "先生,您的心跳数据是:" + heartRate + ",还需进一步检查!");
}
// 检查结束!
System.out.println("检查结束!");
System.out.println("\n测试病人心跳数据正常时:");
System.out.println("开始检查...");
// if判断心跳数据是否小于60,或者大于100,如果是true,就为异常
if (heartRate2 < 60 || heartRate2 > 100) {
// 判断结果为false,发现病人的心跳数据正常,不符合判断条件,所以不执行if里的代码语句
System.out.println(patientName + "先生,您的心跳数据是:" + heartRate2 + ",还需进一步检查!");
}
// 检查结束!
System.out.println("检查结束!");
System.out.println("\n-----------------if格式2-----------------");
// 需求:给女朋友发一个1314的红包,钱包余额:1550.89
/*
分析需求:
1.定义一个男方名字、钱包:余额为1550.89
2.使用if分支结构的 格式2 来判断男方微信钱包余额是否大于等于1314;
如果大于等于1314,则返回:“红包已发送!”
如果小于1314,则返回:“钱包余额不足,红包未发送!”
3. 格式2:if (条件表达式) {代码块1...} else {代码块2...}
*/
// 1.定义一个男方名字、钱包:余额为1550.89
String manName = "赵云";
double money = 1550.89; // 模拟钱包余额充足
double money2 = 2.5; // 模拟钱包余额不足
System.out.println("测试钱包余额充足时:");
// 2.使用if分支结构的格式2来判断男方微信钱包余额是否大于等于1314
if (money >= 1314) {
// 判断结果为true,发现用户的余额大于等于1314,则返回:“红包已发送!”,将不执行代码块2
System.out.println(manName + "先生,您的红包已发送成功!");
}else {
// 判断结果为false,发现用户的余额小于1314,则返回:“钱包余额不足,红包未发送!”,将不执行代码块1
System.out.println(manName + "先生,您的钱包余额已不足,红包未发送成功!");
}
System.out.println("\n测试钱包余额不足时:");
// 2.使用if分支结构的格式2来判断男方微信钱包余额是否大于等于1314
if (money2 >= 1314) {
// 判断结果为true,发现用户的余额大于等于1314,则返回:“红包已发送!”,将不执行代码块2
System.out.println(manName + "先生,您的红包已发送成功!");
}else {
// 判断结果为false,发现用户的余额小于1314,则返回:“钱包余额不足,红包未发送!”,将不执行代码块1
System.out.println(manName + "先生,您的钱包余额已不足,红包未发送成功!");
}
System.out.println("\n-----------------if格式3-----------------");
/*
需求:绩效系统——>评级:C(0-60)、B(60-80)、A(80-90)、A+(90-100)
需求分析:
1、定义一个公司员工,员工的绩效分数
2、使用if格式3来判断这个员工的几个月份的绩效分别属于什么级别
属于c,则返回:姓名 + “,你的绩效是C等级“
....
3、格式3:
if (条件表达式1) {
代码1...
}else if (条件表达式2) {
代码2...
} ...
else {
代码n+1...
}
*/
// 1、定义一个公司员工,员工的绩效分数
// 假如第一个月5分、第二个月91分、第三个月78分、第四个月89分
System.out.println("测试员工第一个月的绩效等级:");
String staff = "关羽";
int score = 5; // 第一个月绩效5分,级别C
int score2 = 91; // 第二个月绩效91分,级别A+
int score3 = 78; // 第三个月绩效78分,级别B
int score4 = 89; // 第四个月绩效89分,级别A
int score5 = 102; // 模拟超出等级规定范围的分数
// 2、使用if格式3来判断员工的第一个月的绩效属于什么级别
if (score >= 0 && score < 60) { // 判断员工第一个月的绩效 是否大于等于0 与 小于60,如果是true,属于C级别
// 如果第一个月的绩效属于C级别,执行如下代码,则不执行其他代码块(判断结果为true)
System.out.println(staff + ",你的第一个月绩效是:C");
} else if (score >= 60 && score < 80) { // 判断员工第一个月的绩效 是否大于等于60 与 小于80,如果是true,属于B级别
// 如果第一个月的绩效属于B级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第一个月绩效是:B");
} else if (score >= 80 && score < 90) { // 判断员工第一个月的绩效 是否大于等于80 与 小于90,如果是true,属于A级别
// 如果第一个月的绩效属于A级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第一个月绩效是:A");
} else if (score >= 90 && score <= 100) { // 判断员工第一个月的绩效 是否大于等于90 与 小于100,如果是true,属于A+级别
// 如果第一个月的绩效属于A+级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第一个月绩效是:A+");
} else {
// 如果本月的绩效分数超出了等级规定的范围,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println("这个月录入的分数有问题!请详察!");
}
System.out.println("\n测试员工第二个月的绩效等级:");
// 2、使用if格式3来判断员工的第二个月的绩效属于什么级别
if (score2 >= 0 && score2 < 60) {
// 如果第二个月的绩效属于C级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第二个月绩效是:C");
} else if (score2 >= 60 && score2 < 80) {
// 如果第二个月的绩效属于B级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第二个月绩效是:B");
} else if (score2 >= 80 && score2 < 90) {
// 如果第二个月的绩效属于A级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第二个月绩效是:A");
} else if (score2 >= 90 && score2 <= 100) {
// 如果第二个月的绩效属于A+级别,执行如下代码,则不执行其他代码块(判断结果为true)
System.out.println(staff + ",你的第二个月绩效是:A+");
} else {
// 如果本月的绩效分数超出了等级规定的范围,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println("这个月录入的分数有问题!请详察!");
}
System.out.println("\n测试员工第三个月的绩效等级:");
// 2、使用if格式3来判断员工的第三个月的绩效属于什么级别
if (score3 >= 0 && score3 < 60) {
// 如果第三个月的绩效属于C级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第三个月绩效是:C");
} else if (score3 >= 60 && score3 < 80) {
// 如果第三个月的绩效属于B级别,执行如下代码,则不执行其他代码块(判断结果为true)
System.out.println(staff + ",你的第三个月绩效是:B");
} else if (score3 >= 80 && score3 < 90) {
// 如果第三个月的绩效属于A级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第三个月绩效是:A");
} else if (score3 >= 90 && score3 <= 100) {
// 如果第三个月的绩效属于A+级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第三个月绩效是:A+");
} else {
// 如果本月的绩效分数超出了等级规定的范围,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println("这个月录入的分数有问题!请详察!");
}
System.out.println("\n测试员工第四个月的绩效等级:");
// 2、使用if格式3来判断员工的第四个月的绩效属于什么级别
if (score4 >= 0 && score4 < 60) {
// 如果第四个月的绩效属于C级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第四个月绩效是:C");
} else if (score4 >= 60 && score4 < 80) {
// 如果第四个月的绩效属于B级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第四个月绩效是:B");
} else if (score4 >= 80 && score4 < 90) {
// 如果第四个月的绩效属于A级别,执行如下代码,则不执行其他代码块(判断结果为true)
System.out.println(staff + ",你的第四个月绩效是:A");
} else if (score4 >= 90 && score4 <= 100) {
// 如果第四个月的绩效属于A+级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你的第四个月绩效是:A+");
} else {
// 如果本月的绩效分数超出了等级规定的范围,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println("这个月录入的分数有问题!请详察!");
}
System.out.println("\n测试员工错误分数的绩效等级:");
// 2、使用if格式3来判断员工的错误分数的绩效属于什么级别
if (score5 >= 0 && score5 < 60) {
// 如果本月绩效属于C级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你本月绩效是:C");
} else if (score5 >= 60 && score5 < 80) {
// 如果本月绩效属于B级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你本月绩效是:B");
} else if (score5 >= 80 && score5 < 90) {
// 如果本月绩效属于A级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你本月绩效是:A");
} else if (score5 >= 90 && score5 <= 100) {
// 如果本月绩效属于A+级别,执行如下代码,则不执行其他代码块(判断结果为false)
System.out.println(staff + ",你本月绩效是:A+");
} else {
// 如果本月的绩效分数超出了等级规定的范围,执行如下代码,则不执行其他代码块(判断结果为true)
System.out.println("这个月录入的分数有问题!请详察!");
}
}
}
以上代码是为了方便初学者理解,才写那么多重复代码,不建议你们也写重复代码。如果你们是自己写,只需要定义一个分数变量,然后通过修改这个变量的值分别对if的各分支进行测试
输出结果:
-----------------if格式1-----------------
测试病人心跳数据异常时:
开始检查...
刘备先生,您的心跳数据是:30,还需进一步检查!
检查结束!
测试病人心跳数据正常时:
开始检查...
检查结束!
-----------------if格式2-----------------
测试钱包余额充足时:
赵云先生,您的红包已发送成功!
测试钱包余额不足时:
赵云先生,您的钱包余额已不足,红包未发送成功!
-----------------if格式3-----------------
测试员工第一个月的绩效等级:
关羽,你的第一个月绩效是:C
测试员工第二个月的绩效等级:
关羽,你的第二个月绩效是:A+
测试员工第三个月的绩效等级:
关羽,你的第三个月绩效是:B
测试员工第四个月的绩效等级:
关羽,你的第四个月绩效是:A
测试员工错误分数的绩效等级:
这个月录入的分数有问题!请详察!
1、If分支的写法有几种,各有什么特点?
三种
格式1:
if (条件表达式) {
语句体;
}
格式2:
if (条件表达式) {
语句体1;
}else {
语句体2; // 当第一个条件不符合才会执行这一句
}
格式3:
if (条件表达式1) {
语句体1;
}else if (条件表达式2) {
语句体2;
}else if (条件表达式3) {
语句体3;
}
......
else {
语句体n+1; // 当以上所有判断都不符合才会执行这一句
}
特点
也是匹配条件去执行分支,适合做值匹配的分支选择,结构清晰,格式良好。
switch(表达式) {
case 值1:
执行代码...;
break; // 跳出switch分支
case 值2:
执行代码...;
break;
...
case 值n-1:
执行代码n-1...;
break;
default:
执行代码n;
}
执行流程
switch案例
package com.app.branch;
public class SwitchDemo2 {
public static void main(String[] args) {
// 目标:学会使用switch分支结构,理解其流程
/*
一、需求:备忘录(一周的行程)
周一:埋头苦干,解决bug
周二:请求大牛程序员帮忙
周三:今晚喝酒、龙虾、小烧烤
周四:主动帮助新来的女程序员解决bug
周五:今晚吃鸡、王者
周六:与王婆介绍的小芳相亲
周日:郁郁寡欢、准备上班
二、分析需求
1.定义变量,分别存放周一、周二、周三、周四、周五、周六、周日
2.使用switch分支结构,设置case值,用变量值 与 case值 进行匹配,提示当天该干什么
*/
// 1.定义变量,用于存放工作日
String weekday = "周一"; // 想测试哪天,就把值换成哪天来测试
// String weekday = "周六";
// String weekday = "周九"; // 用于测试错误数据
// 2.使用switch分支结构,设置case值,用变量值 与 case值 进行匹配,输出当天该干什么
switch (weekday) {
case "周一":
// 值匹配成功,提示今日要做的事
System.out.println("埋头苦干,解决bug");
// 跳出switch
break;
case "周二":
System.out.println("请求大牛程序员帮忙");
break;
case "周三":
System.out.println("今晚喝酒、龙虾、小烧烤");
break;
case "周四":
System.out.println("主动帮助新来的女程序员解决bug");
break;
case "周五":
System.out.println("今晚吃鸡、王者");
break;
case "周六":
System.out.println("与王婆介绍的小芳相亲");
break;
case "周日":
System.out.println("郁郁寡欢、准备上班");
break;
default: // 当switch(表达式)——>表达式的值匹配不上所有case后的值时,执行以下代码
System.out.println("数据错误!");
}
}
}
输出结果:
埋头苦干,解决bug
1、switch分支的格式、执行流程是怎么样的?
switch(表达式) {
case 值1:
执行代码...;
break; // 跳出switch分支
case 值2:
执行代码...;
break;
...
case 值n-1:
执行代码n-1...;
break;
default:
执行代码n;
}
执行流程
2、if、switch分支各自适合做什么业务场景?
(1)表达式类型只能是byte、short、int、char,JDK5开始支持枚举(还没学可以先了解),JDK7开始支持String,不支持double、float、long
可以看到,都报错了,说明不支持
(2)case给出的值不允许重复,且只能是字面量,不能是变量
可以看出,将周二、三、四、五的break注释之后。当表达式的值”周二“ 与 case 值”周二“ 匹配成功后,由于没有break,无法跳出switch分支,才会导致,穿到周三,由于周三也没有break;又穿到周四,周四也没有break;又穿到周五,周五也没有break;又穿到了周六,结果发现在周六这里遇到了break,就跳出switch分支了。结果将周二、三、四、五、六的事件都输出了个遍。
所以,每设置完一个case后,必须搭配一个break,不然会出现switch穿透性的问题!!!
需求:用户输入月份可以展示该月份的天数
package com.app.branch;
// 1.导入Scanner包
import java.util.Scanner;
public class SwitchTest04 {
public static void main(String[] args) {
// 目标:通过案例学会使用switch的穿透性,并理解其流程
/*
需求:用户输入月份可以展示该月份的天数
(1) 1、3、5、7、8、10、12月份都是31天
(2) 2月份是闰年为29天、非闰年为28天
(3) 4、6、9、11月是30天
分析需求 :
1.导入Scanner包
2.创建Scanner扫描器对象
3.定义变量,用于接收用户输入的月份
4.使用switch分支将 用户输入的月份 与 case值 进行匹配
5.利用switch的穿透性设置case值为1、3、5、7、8、10都不设置break跳出,直到12才设置break跳出分支,执行输出:用户输入的月份 + ”月是31天“
6.case值为2时,设置break跳出分支,执行输出:用户输入的月份 + ”月是闰年为29天、非闰年为28天“
7.case值为4、6、9都不设置break跳出,直到11才设置break跳出分支,执行输出:用户输入的月份 + ”月是30天“
*/
// 2.创建Scanner扫描器对象
Scanner sc = new Scanner(System.in);
System.out.println("请您输入月份(1~12):");
// 3.定义变量,用于接收用户输入的月份
int month = sc.nextInt();
// 4.使用switch分支将 用户输入的月份 与 case值 进行匹配
switch (month) {
// 5
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(month + "月是31天");
break;
// 6
case 2:
System.out.println(month + "月是闰年为29天、非闰年为28天");
break;
// 7
case 4:
case 6:
case 9:
case 11:
System.out.println(month + "月是30天");
break;
default:
System.out.println("数据错误!");
}
}
}
输出结果1:
请您输入月份(1~12):
1
1月是31天
输出结果2:
请您输入月份(1~12):
3
3月是31天
输出结果3:
请您输入月份(1~12):
5
5月是31天
输出结果4:
请您输入月份(1~12):
7
7月是31天
输出结果5:
请您输入月份(1~12):
8
8月是31天
输出结果6:
请您输入月份(1~12):
10
10月是31天
输出结果7:
请您输入月份(1~12):
12
12月是31天
输出结果8:
请您输入月份(1~12):
2
2月是闰年为29天、非闰年为28天
输出结果9:
请您输入月份(1~12):
4
4月是30天
输出结果10:
请您输入月份(1~12):
6
6月是30天
输出结果11:
请您输入月份(1~12):
9
9月是30天
输出结果12:
请您输入月份(1~12):
11
11月是30天
1、什么情况下会出现switch穿透现象?
2、switch穿透性能解决什么问题?