Day4:if / else 条件判断总结
一、今日学习目标
Day4 主要学习 Java 中的条件判断语句:
-
if -
if / else -
if / else if / else -
多个独立
if的使用场景 -
字符串比较
.equals() -
使用 AI 优化
if结构
今日完成的练习:
-
成绩分级系统:A / B / C / D
-
年龄票价判断
-
正负数和奇偶判断
-
登录判断
二、if / else 的核心作用
程序默认是从上往下一行一行执行的。
但是实际开发中,经常需要根据不同条件执行不同代码。
例如:
如果成绩 >= 90:
输出 A
否则如果成绩 >= 80:
输出 B
否则如果成绩 >= 60:
输出 C
否则:
输出 D
这种“根据条件选择执行路线”的逻辑,就需要使用 if / else。
三、if 的基本格式
if (条件) {
// 条件成立时执行这里的代码
}
示例:
int score = 95;
if (score >= 90) {
System.out.println("优秀");
}
含义:
如果 score 大于等于 90,就输出“优秀”。
如果条件不成立,就跳过 if 里面的代码。
四、if / else 的格式
if (条件) {
// 条件成立时执行
} else {
// 条件不成立时执行
}
示例:
int age = 18;
if (age >= 18) {
System.out.println("成年人");
} else {
System.out.println("未成年人");
}
含义:
如果 age >= 18 成立,输出“成年人”。
否则输出“未成年人”。
五、if / else if / else 的格式
当有多个条件需要判断,并且最终结果只能选择其中一个时,使用:
if (条件1) {
// 条件1成立时执行
} else if (条件2) {
// 条件1不成立,条件2成立时执行
} else if (条件3) {
// 条件1、条件2都不成立,条件3成立时执行
} else {
// 上面条件都不成立时执行
}
重点:
if / else if / else 是一组互斥判断。
只要前面有一个条件成立,后面的条件就不会继续判断。
六、多个独立 if 的使用场景
多个独立 if 的格式:
if (条件1) {
// 判断第一件事
}
if (条件2) {
// 判断第二件事
}
重点:
多个独立 if 之间互不影响。
第一个 if 判断完以后,程序还会继续判断第二个 if。
适合场景:
需要同时判断多个不同维度的问题。
例如:
一个数字既要判断:正数 / 负数 / 零
还要判断:奇数 / 偶数
这两个结果都要输出,所以应该写成两组判断。
七、今日重点区别:else if 和多个 if
1. if / else if / else
适合:结果只能选一个。
例如成绩等级:
A / B / C / D 只能输出其中一个。
所以使用:
if (...) {
} else if (...) {
} else if (...) {
} else {
}
2. 多个独立 if
适合:多个结果都要判断。
例如:
5 是正数,同时也是奇数。
-8 是负数,同时也是偶数。
0 是零,同时也是偶数。
所以可以写成:
if (...) {
// 判断正负零
}
if (...) {
// 判断奇偶
}
八、常用判断符号总结
| 符号 | 含义 | 示例 |
|---|---|---|
> |
大于 | score > 90 |
< |
小于 | age < 18 |
>= |
大于等于 | score >= 60 |
<= |
小于等于 | score <= 100 |
== |
判断基本类型是否相等 | num == 0 |
!= |
不等于 | num != 0 |
&& |
并且,两个条件都要成立 | score >= 90 && score <= 100 |
|| |
或者,两个条件满足一个即可 | score < 0 || score > 100 |
九、重要知识点:字符串比较不能用 ==
判断字符串内容是否相等,要使用 .equals()。
正确写法:
name.equals("admin")
错误写法:
name == "admin"
原因:
== 更适合判断基本数据类型的值是否相等。
例如 int、double、char、boolean 等。
String 是引用类型。
判断字符串内容是否一样,要使用 equals() 方法。
十、练习代码 1:成绩分级系统
文件名:IfelseDemo.java
功能:
输入一个成绩 score。
根据成绩输出 A / B / C / D。
如果成绩小于 0 或大于 100,输出“成绩不合法”。
package Day1to30;
import java.util.Scanner;
public class IfelseDemo {
public static void main(String[] args) {
// 创建 Scanner 对象,用于接收键盘输入
// System.in 表示从控制台输入内容
Scanner sc = new Scanner(System.in);
// 提示用户输入成绩
System.out.println("请输入一个成绩:");
// 使用 nextInt() 接收用户输入的整数
// 这里把输入的成绩保存到 int 类型变量 score 中
int score = sc.nextInt();
// 第一层先判断成绩是否合法
// score < 0:成绩不能小于 0
// score > 100:成绩不能大于 100
// || 表示“或者”,两个条件只要有一个成立,整体条件就成立
if (score < 0 || score > 100) {
System.out.println("成绩不合法");
// 走到这里,说明上面的非法成绩判断已经不成立
// 也就是说,score 一定在 0 到 100 之间
// 所以后面不需要再写 score <= 100
} else if (score >= 90) {
System.out.println("等级:A");
// 能走到这里,说明 score >= 90 已经不成立
// 所以这里只需要判断 score >= 80
// 实际范围就是:80 <= score < 90
} else if (score >= 80) {
System.out.println("等级:B");
// 能走到这里,说明 score >= 80 已经不成立
// 所以这里只需要判断 score >= 60
// 实际范围就是:60 <= score < 80
} else if (score >= 60) {
System.out.println("等级:C");
// 前面的条件都不成立
// 但 score 又是合法成绩
// 所以剩下的范围就是:0 <= score < 60
} else {
System.out.println("等级:D");
}
// 关闭 Scanner,释放资源
sc.close();
}
}
成绩分级代码重点
1. 先判断非法数据
if (score < 0 || score > 100)
这样做的好处:
先排除错误数据,后面就只处理正常成绩。
代码更清晰。
2. 为什么不用每次都写完整范围?
原始写法:
score >= 80 && score < 90
优化写法:
score >= 80
原因:
if / else if 是从上往下判断的。
如果程序能走到 score >= 80 这里,说明 score >= 90 已经失败了。
所以此时 score 一定小于 90。
十一、练习代码 2:年龄票价判断
文件名:AgeTicketDemo.java
功能:
输入年龄 age。
根据年龄输出对应票价类型。
判断规则:
年龄小于 0:年龄不合法
年龄小于 6:儿童免票
年龄小于 18:未成年人半价
年龄小于 60:成年人全价
年龄大于等于 60:老人优惠票
package Day1to30;
import java.util.Scanner;
public class AgeTicketDemo {
public static void main(String[] args) {
// 创建 Scanner 对象,用于接收控制台输入
Scanner sc = new Scanner(System.in);
// 提示用户输入年龄
System.out.println("请输入年龄:");
// 接收用户输入的整数年龄
int age = sc.nextInt();
// 先判断非法年龄
// 年龄小于 0 不符合实际情况
if (age < 0) {
System.out.println("年龄不合法");
// 能走到这里,说明 age >= 0
// 再判断是否小于 6
// 实际范围就是:0 <= age < 6
} else if (age < 6) {
System.out.println("儿童免票");
// 能走到这里,说明 age >= 6
// 再判断是否小于 18
// 实际范围就是:6 <= age < 18
} else if (age < 18) {
System.out.println("未成年人半价");
// 能走到这里,说明 age >= 18
// 再判断是否小于 60
// 实际范围就是:18 <= age < 60
} else if (age < 60) {
System.out.println("成年人全价");
// 前面的条件都不成立
// 说明 age >= 60
} else {
System.out.println("老人优惠票");
}
// 关闭 Scanner,释放资源
sc.close();
}
}
年龄判断代码重点
这类判断是从小到大判断:
if (age < 0) {
} else if (age < 6) {
} else if (age < 18) {
} else if (age < 60) {
} else {
}
重点:
因为前面的条件已经过滤掉一部分数据,后面就不用重复写下限。
例如:
else if (age < 18)
它实际表示:
age >= 6 并且 age < 18
因为 age < 6 前面已经判断失败了。
十二、练习代码 3:正负数和奇偶判断
文件名:NumberCheckDemo.java
功能:
输入一个整数 num。
判断它是正数、负数还是零。
再判断它是奇数还是偶数。
package Day1to30;
import java.util.Scanner;
public class NumberCheckDemo {
public static void main(String[] args) {
// 创建 Scanner 对象,用于接收键盘输入
Scanner sc = new Scanner(System.in);
// 提示用户输入一个整数
System.out.println("请输入一个整数:");
// 接收用户输入的整数
int num = sc.nextInt();
// 第一组判断:判断正数、负数、零
// 这一组判断的结果只能是其中一个
// 所以使用 if / else if / else
if (num > 0) {
System.out.println("正数");
} else if (num < 0) {
System.out.println("负数");
} else {
System.out.println("零");
}
// 第二组判断:判断奇数、偶数
// 这里使用新的 if,是因为奇偶判断和上面的正负判断是两件事
// 程序需要先输出正负零,再继续输出奇偶
// % 是取余运算符
// num % 2 表示 num 除以 2 之后的余数
// 如果余数是 0,说明可以被 2 整除,就是偶数
if (num % 2 == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
// 关闭 Scanner,释放资源
sc.close();
}
}
正负数和奇偶判断代码重点
这题要特别注意:
正负零判断 和 奇偶判断 是两个不同维度。
所以代码应该写成两组:
if (num > 0) {
System.out.println("正数");
} else if (num < 0) {
System.out.println("负数");
} else {
System.out.println("零");
}
if (num % 2 == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
原因:
一个数既有正负零属性,也有奇偶属性。
这两个结果都要输出。
例如:
5:正数、奇数
-8:负数、偶数
0:零、偶数
十三、练习代码 4:登录判断
文件名:LoginDemo.java
功能:
输入用户名和密码。
根据用户名和密码判断登录结果。
规则:
用户名:admin
密码:123456
判断结果:
用户名和密码都正确:登录成功
用户名正确,密码错误:密码错误
用户名错误:用户名不存在
版本一:基础版
package Day1to30;
import java.util.Scanner;
public class LoginDemo {
public static void main(String[] args) {
// 创建 Scanner 对象,用于接收键盘输入
Scanner sc = new Scanner(System.in);
// 提示用户输入用户名
System.out.println("请输入用户名:");
// 使用 next() 接收字符串
// name 用来保存用户输入的用户名
String name = sc.next();
// 提示用户输入密码
System.out.println("请输入密码:");
// pwd 用来保存用户输入的密码
// 这里密码虽然是数字形式,但是用 String 保存更合适
// 因为密码通常不参与数学计算
String pwd = sc.next();
// 判断用户名和密码是否都正确
// && 表示“并且”
// 左右两个条件都成立,整体条件才成立
// 字符串内容比较要使用 equals(),不能使用 ==
if (name.equals("admin") && pwd.equals("123456")) {
System.out.println("登录成功");
// 能走到这里,说明上面的“用户名和密码都正确”不成立
// 如果用户名仍然等于 admin,说明用户名正确,但是密码错误
} else if (name.equals("admin")) {
System.out.println("密码错误");
// 如果用户名不是 admin,就直接提示用户名不存在
} else {
System.out.println("用户名不存在");
}
// 关闭 Scanner,释放资源
sc.close();
}
}
版本二:AI 优化版
优化目标:
减少重复判断,让 if 条件更像人话,更容易阅读。
package Day1to30;
import java.util.Scanner;
public class LoginDemo {
public static void main(String[] args) {
// 创建 Scanner 对象,用于接收键盘输入
Scanner sc = new Scanner(System.in);
// 输入用户名
System.out.println("请输入用户名:");
String name = sc.next();
// 输入密码
System.out.println("请输入密码:");
String pwd = sc.next();
// 把“用户名是否正确”的判断结果保存到 boolean 变量中
// boolean 类型只有两个值:true 或 false
// 如果 name 的内容等于 admin,isUsernameCorrect 就是 true
// 否则就是 false
boolean isUsernameCorrect = name.equals("admin");
// 把“密码是否正确”的判断结果保存到 boolean 变量中
// 如果 pwd 的内容等于 123456,isPasswordCorrect 就是 true
// 否则就是 false
boolean isPasswordCorrect = pwd.equals("123456");
// 这里的判断就更清晰:
// 如果用户名正确,并且密码正确,就登录成功
if (isUsernameCorrect && isPasswordCorrect) {
System.out.println("登录成功");
// 如果用户名正确,但是没有进入上面的登录成功
// 说明密码一定是错误的
} else if (isUsernameCorrect) {
System.out.println("密码错误");
// 如果用户名不正确,就提示用户名不存在
} else {
System.out.println("用户名不存在");
}
// 关闭 Scanner,释放资源
sc.close();
}
}
登录判断代码重点
1. 字符串比较使用 equals()
正确:
name.equals("admin")
错误:
name == "admin"
原因:
String 是引用类型。
判断字符串内容是否相等,使用 equals()。
2. && 表示并且
name.equals("admin") && pwd.equals("123456")
含义:
用户名等于 admin,并且密码等于 123456。
两个条件都成立,整体才成立。
3. boolean 可以保存判断结果
boolean isUsernameCorrect = name.equals("admin");
boolean isPasswordCorrect = pwd.equals("123456");
好处:
让代码更清晰。
减少重复判断。
以后条件复杂时,更容易维护。
十四、今日常见错误总结
错误 1:非法成绩判断后,又继续判断等级
错误写法:
if (score < 0 || score > 100) {
System.out.println("成绩不合法");
}
if (score >= 90) {
System.out.println("等级:A");
}
问题:
两个 if 是独立的。
第一个 if 判断完,第二个 if 还会继续执行。
例如输入:
101
可能输出:
成绩不合法
等级:A
正确写法:
if (score < 0 || score > 100) {
System.out.println("成绩不合法");
} else if (score >= 90) {
System.out.println("等级:A");
}
错误 2:字符串使用 == 比较
错误写法:
if (name == "admin") {
System.out.println("用户名正确");
}
正确写法:
if (name.equals("admin")) {
System.out.println("用户名正确");
}
错误 3:忘记关闭 Scanner
建议每个程序最后加上:
sc.close();
说明:
Scanner 用完后关闭,是一种良好的代码习惯。
小练习中不写通常也能运行,但建议养成习惯。
十五、Day4 最终总结
今天最重要的一句话:
如果结果只能选一个,用 if / else if / else。
如果要判断多个不同事情,可以写多个独立 if。
例如:
成绩等级只能是 A / B / C / D 其中一个,所以用 if / else if / else。
数字既可以是正数,又可以是奇数,所以正负判断和奇偶判断要分开写。
今日完成情况
[x] 学:if / else
[x] 写:成绩分级系统(A/B/C/D)
[x] AI:优化 if 结构
[x] 练习:年龄票价判断
[x] 练习:正负数和奇偶判断
[x] 练习:登录判断
今日建议复习题
题 1
为什么下面代码会有问题?
if (score < 0 || score > 100) {
System.out.println("成绩不合法");
}
if (score >= 90) {
System.out.println("等级:A");
}
答案:
因为这是两个独立 if。
第一个 if 执行完以后,第二个 if 还会继续判断。
应该把第二个 if 改成 else if。
题 2
字符串判断用户名是否等于 admin,应该怎么写?
答案:
name.equals("admin")
题 3
判断一个数字是否是偶数,应该怎么写?
答案:
num % 2 == 0
题 4
&& 和 || 有什么区别?
答案:
&& 表示并且,两个条件都成立,整体才成立。
|| 表示或者,两个条件只要有一个成立,整体就成立。