在之前的编程学习中,我们编写的程序都是按照顺序一条一条执行的,就像沿着一条直线走路一样。但是现实世界中的问题往往需要根据不同的情况做出不同的选择。 比如,如果今天下雨,我们就带伞;如果不下雨,就不带伞。这种“如果...那么...”的逻辑在编程中称为决策结构。
决策结构让程序能够根据不同的条件选择不同的执行路径,就像在十字路口选择不同的方向一样。Java提供了几种决策结构,让我们从最简单的开始学习。

if语句是Java中最基本的决策结构。它的工作原理很简单:当某个条件为真时,执行特定的代码;当条件为假时,跳过这些代码。
假设你正在写一个程序来判断学生是否及格。如果分数大于等于60分,就显示“及格”;如果小于60分,就不显示任何信息。这就是if语句的典型应用。
if语句的基本语法如下:
|if (条件表达式) { // 当条件为真时执行的代码 }
条件表达式必须是一个布尔表达式,也就是说,它的结果只能是true或false。
要构建条件表达式,我们需要使用关系运算符。这些运算符用来比较两个值之间的关系:
让我们看一个简单的例子:
|public class SimpleIfDemo { public static void main(String[] args) { int score = 85; if (score >= 60) { System.out.println("恭喜!你及格了!"); } System.out.println("程序结束"); } }
运行这个程序会输出:
|恭喜!你及格了! 程序结束
如果我们将分数改为55,程序会输出:
|程序结束
让我们详细分析一下if语句是如何工作的:
有时候我们需要检查多个条件。比如,判断一个学生是否优秀,可能需要同时满足多个条件:分数大于90分,并且出勤率大于80%。
|public class MultipleConditionsDemo { public static void main(String[] args) { int score = 95; int attendance = 85; if (score > 90 && attendance > 80) { System.out.println("优秀学生!"); }
当我们需要组合多个条件时,需要使用逻辑运算符:
我们也可以对字符进行比较。在Java中,字符(char类型)实际上是一个16位的无符号整数,底层存储的是该字符对应的Unicode编码值。
因此,比较字符时,实际上是比较它们的Unicode编码。例如,'A'的Unicode编码是65,'B'是66,所以'A' < 'B'的结果为true。
你可以使用等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等运算符来比较字符。
这样可以判断某个字符是否等于、早于或晚于另一个字符在Unicode表中的顺序。
|public class CharacterComparisonDemo { public static void main(String[] args) { char grade = 'A'; if (grade == 'A') { System.out.println("优秀!"); } if (grade >= 'A' && grade <= 'C') {
if语句只能处理条件为真时的情况,但如果条件为假时,我们也想执行一些代码,该怎么办呢?这时候就需要使用if-else语句。
if-else语句提供了两个执行路径:当条件为真时执行一组代码,当条件为假时执行另一组代码。
|if (条件表达式) { // 条件为真时执行的代码 } else { // 条件为假时执行的代码 }
让我们看一个判断数字是奇数还是偶数的例子:
|public class OddEvenDemo { public static void main(String[] args) { int number = 7; if (number % 2 == 0) { System.out.println(number + " 是偶数"); } else { System.out.println(number + " 是奇数"
运行这个程序会输出:
|7 是奇数
如果我们将number改为8,程序会输出:
|8 是偶数
让我们看一个更实用的例子,判断温度是否适宜:
|public class TemperatureDemo { public static void main(String[] args) { double temperature = 25.5; if (temperature >= 20 && temperature <= 30) { System.out.println("温度适宜,很舒服!"); } else { System.out.println("温度不太适宜,注意调节"
有时候我们需要进行多重判断。比如,判断一个学生的成绩等级,需要先判断是否及格,如果及格再判断是优秀、良好还是中等。
嵌套if语句就是在一个if语句内部再包含另一个if语句。
|if (条件1) { if (条件2) { // 条件1和条件2都为真时执行 } else { // 条件1为真,条件2为假时执行 } } else { // 条件1为假时执行 }
|public class GradeDemo { public static void main(String[] args) { int score = 85; if (score >= 60) { if (score >= 90) { System.out.println("优秀"); } else if (score >= 80) {
运行这个程序会输出:
|良好
下面我们来看一个更为详细和复杂的例子,演示如何通过嵌套if语句判断一个人是否有资格获得贷款。这个判断过程通常会涉及多个条件,比如申请人的年薪是否达到要求、在当前工作岗位上的工作年限是否足够等。 只有当所有条件都满足时,申请人才有资格获得贷款。我们将通过代码示例一步步分析每个判断条件的作用和执行流程:
|public class LoanQualifierDemo { public static void main(String[] args) { double salary = 35000; int yearsOnJob = 3; if (salary >= 30000) { if (yearsOnJob >= 2) { System.out.println("恭喜!你有资格获得贷款。"); }
相信你也发现了,当我们需要依次判断多个条件,并根据不同的条件执行不同的代码时,如果只用嵌套的if语句,代码会变得冗长且难以阅读。
例如,判断成绩等级时,如果每个等级都用一个if嵌套在另一个if里面,结构会非常复杂。
为了解决这个问题,Java 提供了 if-else-if 语句结构。通过 if-else-if 语句,我们可以将多个条件判断串联起来,使代码更加简洁、清晰,并且易于维护。
每个条件会依次被判断,一旦有条件为真,对应的代码块就会被执行,其余的条件将被跳过。
|if (条件1) { // 条件1为真时执行 } else if (条件2) { // 条件1为假,条件2为真时执行 } else if (条件3) { // 条件1和条件2都为假,条件3为真时执行 } else { // 所有条件都为假时执行 }
下面我们将详细介绍如何使用 if-else-if 语句来判断学生的成绩等级。假设我们有一个学生的分数,需要根据分数的不同区间输出对应的等级。常见的分数等级划分如下:
使用 if-else-if 语句可以让我们按照上述顺序依次判断每个条件,一旦某个条件成立,就会执行对应的代码块,并跳过后续的判断。这样不仅让代码结构更加清晰,也方便后期维护和扩展。
下面是详细的代码示例:
|public class ImprovedGradeDemo { public static void main(String[] args) { int score = 75; if (score >= 90) { System.out.println("优秀"); } else if (score >= 80) { System.out.println("良好"
运行这个程序会输出:
|中等
下面我们通过一个具体的例子,详细说明如何使用 if-else-if 语句判断某个月份属于哪个季节。我们将输入一个月份(1~12),程序会根据月份判断并输出对应的季节(春季、夏季、秋季、冬季)。判断的逻辑如下:
接下来是详细的代码演示:
|public class SeasonDemo { public static void main(String[] args) { int month = 3; if (month == 12 || month == 1 || month == 2) { System.out.println("冬季"); } else if (month
在Java中,字符串(String)是一种对象类型,而不是基本数据类型。当我们用==运算符比较两个字符串时,实际上比较的是这两个字符串对象在内存中的引用(即它们的内存地址)是否相同,
而不是它们的内容是否一致。也就是说,只有当两个字符串变量指向同一个内存地址时,==才会返回true,即使它们的内容完全一样,如果它们是不同的对象,==也会返回false。
举个例子:
要比较字符串的内容,应该使用String类的equals方法:
|public class StringComparisonDemo { public static void main(String[] args) { String name1 = "张三"; String name2 = "张三"; String name3 = "李四"; // 错误的比较方法 if (name1 == name2) { System.out.println("使用==比较:相同"); } else {
运行这个程序会输出:
|使用==比较:不同 使用equals比较:相同 name1和name3不同
在实际开发中,有些场景下我们需要比较两个字符串是否相等,但又不关心它们的大小写(比如用户名、邮箱、验证码等的校验)。
这时,如果直接使用equals方法进行比较,只要有一个字母的大小写不同,结果就会是false。
为了解决这个问题,Java为String类提供了equalsIgnoreCase方法。该方法会在比较字符串内容时自动忽略大小写差异,只要内容相同就会返回true。
使用方法如下:
|public class CaseInsensitiveDemo { public static void main(String[] args) { String password = "Admin123"; if (password.equalsIgnoreCase("admin123")) { System.out.println("密码正确!"); } else { System.out.println("密码错误!"); } }
运行这个程序会输出:
|密码正确!
在编程中,我们经常会遇到这样的场景:需要根据某个变量的不同取值来执行不同的操作。 比如,根据用户输入的数字判断星期几,或者根据菜单选项执行不同的功能。如果使用一连串的if-else-if语句来实现,代码会变得冗长且不易维护,尤其是分支较多时,结构会非常臃肿。 为了解决这个问题,Java提供了switch语句。switch语句允许我们根据表达式的不同取值,跳转到对应的case分支执行相应的代码。 这样不仅让代码更加简洁明了,也提高了可读性和维护性。通常,switch语句适用于分支较多且判断条件为固定值(如整数、字符、字符串等)的场景。
|switch (表达式) { case 值1: // 当表达式等于值1时执行 break; case 值2: // 当表达式等于值2时执行 break; case 值3: // 当表达式等于值3时执行 break; default: // 当表达式不等于任何case值时执行 break; }
|public class WeekdayDemo { public static void main(String[] args) { int day = 3; switch (day) { case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二");
运行这个程序会输出:
|星期三
在 switch 语句中,break 语句起着至关重要的作用。每当某个 case 匹配成功并执行完相应代码后,break 语句会使程序跳出整个 switch 结构,防止继续执行后续的 case 分支。
如果省略了 break,程序不会在当前 case 结束时停止,而是会依次执行后面所有的 case 语句(这种现象称为“贯穿”或“fall through”),直到遇到下一个 break 或 switch 语句结束为止。
这通常会导致意想不到的结果。下面通过一个例子来演示没有 break 时的执行效果:
|public class BreakDemo { public static void main(String[] args) { int grade = 'B'; switch (grade) { case 'A': System.out.println("优秀"); case 'B': System.out.println("良好"); case 'C'
上面的程序在匹配到'B'时因为缺少break语句,会继续执行后面的case语句,直到遇到break或switch语句结束为止。
所以会输出:
|良好 中等 及格 不及格
从Java 7开始,switch语句也可以使用字符串作为条件表达式。
|public class StringSwitchDemo { public static void main(String[] args) { String season = "spring"; switch (season) { case "spring": System.out.println("春天"); break; case "summer": System.out.println("夏天");
在实际开发中,我们经常需要按照特定的格式来输出数据,比如控制小数点位数、对齐方式、数字的千位分隔符等。
Java 提供了 printf 方法(属于 PrintStream 类,例如 System.out),可以像 C 语言一样,通过格式化字符串和参数,实现灵活的输出控制。
例如,可以用 %.2f 保留两位小数,用 %d 输出整数,用 %s 输出字符串等。通过合理使用 printf,可以让输出结果更加美观、易读,满足各种报表、对齐、财务等场景的需求。
|public class FormattingDemo { public static void main(String[] args) { double price = 19.99; int quantity = 5; double total = price * quantity; // 格式化输出 System.out.printf("单价:%.2f\n", price); System.out.printf
运行这个程序会输出:
|单价:19.99 数量:5 总价:99.95 年薪:1,234,567.89 姓名:张三 年龄: 25 姓名:李四 年龄: 30
7. 简单if语句
编写一个程序,判断一个数字是否为正数、负数或零。
|public class NumberCheck { public static void main(String[] args) { int number = -5; if (number > 0) { System.out.println(number + " 是正数"); } else if (number < 0) { System.out.println
8. if-else语句
编写一个程序,判断一个人的年龄是否成年(18岁以上)。
|public class AgeCheck { public static void main(String[] args) { int age = 20; if (age >= 18) { System.out.println("已成年"); } else { System.out.println("未成年"); } }
9. if-else-if语句
编写一个程序,根据分数给出等级:90分以上优秀,80-89分良好,70-79分中等,60-69分及格,60分以下不及格。
|public class GradeSystem { public static void main(String[] args) { int score = 85; if (score >= 90) { System.out.println("优秀"); } else if (score >= 80) { System.out.println("良好"
10. switch语句
编写一个程序,根据数字(1-7)显示对应的星期名称。
|public class WeekdayDisplay { public static void main(String[] args) { int day = 3; switch (day) { case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二"
输出结果:
|-5 是负数
说明:
if-else-if结构进行多条件判断number > 0判断是否为正数number < 0判断是否为负数else处理为零的情况输出结果:
|已成年
说明:
age >= 18判断年龄是否大于等于18if-else提供两个执行路径输出结果:
|良好
说明:
if-else-if结构依次判断多个条件输出结果:
|星期三
说明:
switch语句根据表达式的值跳转到对应的casecase后必须有break语句防止穿透default处理所有不匹配的情况