Java编程的核心在于将逻辑思维转化为可执行的代码。本专栏通过8个实用案例,覆盖条件判断、循环结构、数组操作、用户交互等基础知识点,展示如何用Java解决实际问题,从简单游戏到数据计算,逐步构建编程思维。
案例一:剪刀石头布游戏——随机数与条件判断的结合
功能说明:实现玩家与计算机的剪刀石头布对战,通过随机数模拟计算机出拳,用条件判断决定胜负。
package a1;import java.util.Random;
import java.util.Scanner;public class RockPaperScissors {public static void main(String[] args) {System.out.println("请输入你的出拳:1.剪刀 2.石头 3.布");Scanner scanner = new Scanner(System.in);int userChoice = scanner.nextInt(); // 接收玩家出拳(1-3)Random random = new Random();int computerChoice = random.nextInt(3) + 1; // 计算机随机出拳(1-3)System.out.println("你的出拳是:" + userChoice);System.out.println("计算机的出拳是:" + computerChoice);// 胜负判断逻辑:通过差值规律简化条件if (userChoice - computerChoice == 1 || userChoice - computerChoice == -2) {// 玩家赢的两种情况:1-0(剪刀胜布)、2-1(石头胜剪刀)、3-2(布胜石头)System.out.println("你赢了");} else if (userChoice - computerChoice == 0) {// 出拳相同则平局System.out.println("平局");} else {// 其余情况计算机赢System.out.println("你输了");}scanner.close();}
}
核心知识点:
- 类名采用帕斯卡命名法(首字母大写),变量名采用驼峰命名法
- 导入语句单独成行,代码块使用4空格缩进
Random
类的nextInt(n)
方法生成随机数,Scanner
使用后关闭资源- 逻辑判断条件清晰,添加适当空格增强可读性
案例二:闰年判断——逻辑运算符的灵活应用
功能说明:根据闰年规则(能被4整除且不能被100整除,或能被400整除)判断输入年份是否为闰年,展示条件简化技巧。
版本一:基础分支判断
package a1;import java.util.Scanner;public class LeapYearChecker {public static void main(String[] args) {System.out.println("输入一个年份");Scanner scanner = new Scanner(System.in);int year = scanner.nextInt();if (year % 4 == 0 && year % 100 != 0) {// 能被4整除但不能被100整除System.out.println("是闰年");} else if (year % 400 == 0) {// 能被400整除System.out.println("是闰年");} else {// 其余情况System.out.println("不是闰年");}scanner.close();}
}
版本二:简化条件判断
package a1;import java.util.Scanner;public class LeapYearCheckerSimplified {public static void main(String[] args) {System.out.println("输入一个年份");Scanner scanner = new Scanner(System.in);int year = scanner.nextInt();// 用逻辑运算符||合并两个闰年条件if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {System.out.println("是闰年");} else {System.out.println("不是闰年");}scanner.close();}
}
核心知识点:
- 运算符前后添加空格(如
year % 4 == 0
而非year%4==0
) - 合理使用空行分隔不同逻辑块,增强可读性
- 复杂条件添加适当注释说明逻辑含义
- 不同版本使用不同类名区分,符合命名规范
案例三:月份天数计算——switch多分支与闰年联动
功能说明:根据输入的年份和月份,计算该月的天数,特别处理2月份在闰年和平年的差异。
package a1;import java.util.Scanner;public class MonthDaysCalculator {public static void main(String[] args) {System.out.println("输入一个年份");Scanner scanner = new Scanner(System.in);int year = scanner.nextInt();System.out.println("输入一个月份");int month = scanner.nextInt();// switch多分支处理12个月份switch (month) {// 31天的月份(1、3、5、7、8、10、12)case 1:case 3:case 5:case 7:case 8:case 10:case 12:System.out.println("31天");break;// 2月份需判断闰年case 2:if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {System.out.println("29天"); // 闰年2月} else {System.out.println("28天"); // 平年2月}break;// 30天的月份(4、6、9、11)case 4:case 6:case 9:case 11:System.out.println("30天");break;default:System.out.println("无效的月份");}scanner.close();}
}
核心知识点:
switch
语句中每个case
单独成行,增强可读性- 添加
default
分支处理异常情况(无效月份) - 合理使用空行分隔不同case组,逻辑更清晰
- 一个
Scanner
对象可复用,无需重复创建
案例四:计算某年某月某日是该年的第几天——数组与循环的综合应用
功能说明:输入日期(年、月、日),计算该日期是当年的第几天,考虑闰年对2月份的影响。
package a1;import java.util.Scanner;public class DayOfYearCalculator {public static void main(String[] args) {System.out.println("输入年");Scanner scanner = new Scanner(System.in);int year = scanner.nextInt();System.out.println("输入月");int month = scanner.nextInt();System.out.println("输入日");int day = scanner.nextInt();System.out.println("是" + year + "年" + month + "月" + day + "日");int totalDays = day; // 初始值为当月天数// 根据闰年定义不同的月份天数数组if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 闰年月份天数数组(2月29天)int[] daysInMonth = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 累加前几个月的天数(month-1是因为数组下标从0开始)for (int i = 0; i < month - 1; i++) {totalDays += daysInMonth[i];}} else {// 平年月份天数数组(2月28天)int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};for (int i = 0; i < month - 1; i++) {totalDays += daysInMonth[i];}}System.out.println("是该年的第" + totalDays + "天");scanner.close();}
}
核心知识点:
- 数组定义格式规范,初始化值清晰排列
for
循环格式规范,循环变量声明在循环内部- 代码块之间添加空行,区分不同逻辑段落
- 变量命名语义化(如
daysInMonth
而非arr
)
案例五:计算数据增长年份——while循环与迭代计算
功能说明:计算初始值在固定年增长率(25%)下,达到目标值所需的年份,展示循环的迭代计算能力。
package a1;public class GrowthYearCalculator {public static void main(String[] args) {int year = 2006; // 起始年份double amount = 80000; // 初始值// 循环条件:未达到目标值(200000)while (amount <= 200000) {amount = amount + amount * 0.25; // 每年增长25%year++; // 年份加1}System.out.println(year + "年达到目标");}
}
核心知识点:
- 循环体内部语句缩进规范,逻辑清晰
- 变量声明添加注释说明用途
- 算术表达式添加适当空格(如
amount + amount * 0.25
) - 代码简洁紧凑,无多余空行
案例六:循环与数组访问——数组越界问题的警示
功能说明:展示循环访问数组的基本方法,同时暴露数组越界的常见错误(反面案例)。
package a1;public class ArrayIndexWarning {public static void main(String[] args) {System.out.println();int i = 0;// 错误示例:循环次数超过数组长度while (i < 5) { // 循环5次(i=0到4)System.out.println(i);String[] ss = {"1", "2"}; // 数组长度为2(下标0和1)// 错误:当i=2、3、4时,ss[i]超出数组下标范围(0-1)System.out.println(ss[i]);i++;}}
}
核心知识点:
- 即使是反面案例,仍保持基本格式规范
- 错误位置添加注释说明问题所在
- 变量和数组命名符合规范
- 展示了数组越界的典型场景,警示循环条件与数组长度匹配的重要性
案例七:计算1-100偶数之和——循环与条件过滤的结合
功能说明:计算1到100之间所有偶数的和,并输出累加过程,展示循环中筛选数据的方法。
package a1;public class EvenNumberSum {public static void main(String[] args) {int sum = 0; // 累加和初始化为0int i = 1;while (i <= 100) { // 遍历1到100if (i % 2 == 0) { // 筛选偶数(能被2整除)sum += i; // 累加偶数System.out.println((i / 2) + "个偶数的和为" + sum); // 输出中间结果}i++; // 变量自增}System.out.println("所有偶数的总和是:" + sum);}
}
核心知识点:
- 条件判断与循环体保持正确缩进
- 复合赋值运算符
+=
使用规范 - 输出语句格式清晰,拼接合理
- 逻辑流程清晰:初始化→循环→判断→累加→输出
案例八:商品购买系统——循环优化与用户交互流程
功能说明:实现支持连续购买的商品选购系统,对比基础版与优化版的代码效率差异。
版本二:优化版(减少重复代码)
package a1;import java.util.Scanner;public class ShoppingSystem {public static void main(String[] args) {String continueFlag = "yes"; // 控制循环的标志位Scanner scanner = new Scanner(System.in);// 循环直接包含完整购买流程,避免重复代码while (continueFlag.equals("yes")) {System.out.println("选择购买的商品编号 1.T恤衫 2.网球衫");int choice = scanner.nextInt();scanner.nextLine(); // consume newlineif (choice == 1) {System.out.println("购买的是T恤衫");} else if (choice == 2) {System.out.println("购买的是网球衫");} else {System.out.println("无效的商品编号");}System.out.println("是否继续购买?yes继续购买 no退出购买");continueFlag = scanner.nextLine(); // 更新标志位}System.out.println("退出购买");scanner.close();}
}
核心知识点:
- 只创建一个
Scanner
对象并复用,避免资源浪费 - 循环结构清晰,将完整流程包含在内,减少代码冗余
- 添加
else
分支处理无效输入,增强程序健壮性 - 使用
scanner.nextLine()
处理字符串输入,避免输入格式问题 - 最后关闭
Scanner
资源,符合规范
代码规范总结
本专栏案例均遵循以下Java代码规范:
-
命名规范
- 类名:帕斯卡命名法(首字母大写,如
RockPaperScissors
) - 变量名:驼峰命名法(首字母小写,如
userChoice
) - 常量名:全大写+下划线(如
MAX_VALUE
)
- 类名:帕斯卡命名法(首字母大写,如
-
格式规范
- 缩进:4个空格(不使用Tab)
- 换行:每个语句单独一行,左大括号
{
不单独换行 - 空格:运算符前后、逗号后加空格(如
a + b
而非a+b
) - 空行:逻辑块之间添加空行,增强可读性
-
代码结构
- 导入语句:单独成行,按字母顺序排列
- 类结构:成员变量→构造方法→普通方法
- 方法内部:先声明变量→初始化→业务逻辑→输出
-
资源管理
Scanner
等资源使用后需关闭- 避免重复创建对象(如一个
Scanner
对象可复用)
遵循这些规范编写的代码,具有更好的可读性、可维护性和一致性,是团队协作和代码复用的基础。