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
對象可復用)
遵循這些規范編寫的代碼,具有更好的可讀性、可維護性和一致性,是團隊協作和代碼復用的基礎。