首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 基礎語法精講 (三):流程控制 (if/switch/循環) 與數組完整指南

     編輯:Java 綜合教學

Java 流程控制與數組 — 從順序/分支/循環結構到數組內存模型的系統建模

程序 = 數據結構 + 算法。流程控制是算法的骨架,數組是最基礎的容器數據結構。本文系統講解 Java 三大基本流程結構、循環控制語句、數組聲明/初始化/訪問/內存模型/多維數組/工具類,並附大量代碼示例與常見錯誤避坑。

一、 三大基本流程結構

  1. 順序結構:自上而下逐行執行,無判斷跳轉。
  2. 分支結構:`if` (布爾表達式) / `switch` (多整型/字符串/枚舉匹配)。
  3. 循環結構:`while` / `do-while` / `for` (含增強 for/foreach)。

二、 分支語句詳解

1. if 語句三種形式

// 單分支
if (condition) { statements; }

// 雙分支
if (condition) { statements; } else { statements; }

// 多分支
if (cond1) { } else if (cond2) { } ... else { }

⚠️ 常見邏輯錯誤:條件順序顛倒

int age = 45;
// 錯誤寫法:先判斷 age>20,45 滿足,打印「青年人」,後續 else if 不再執行
if (age > 20) { println("青年人"); }
else if (age > 40) { println("中年人"); } // 永遠執行不到
else if (age > 60) { println("老年人"); }

// 正確寫法:範圍從大到小 / 互斥區間
if (age > 60) { println("老年人"); }
else if (age > 40) { println("中年人"); }
else if (age > 20) { println("青年人"); }

隱含條件原理:`else` 代表「前面所有條件都不成立」。`else if (age > 40)` 實際邏輯是 `age > 40 && !(age > 60)`。

2. switch 語句 (JDK 12+ switch 表達式 / 傳統 switch)

// 傳統 switch (JDK 12 前)
switch (score) {
    case 'A': println("優秀"); break;
    case 'B': println("良好"); break;
    default: println("錯誤");
}

// JDK 12+ Switch 表達式 (箭頭語法,無 break 穿透)
String result = switch (season) {
    case "春天" -> "春暖花開";
    case "夏天" -> "夏日炎炎";
    default -> "未知季節";
};

⚠️ 穿透陷阱:漏寫 `break` 導致繼續執行下一 case。JDK 12+ 箭頭語法默認無穿透。

三、 循環語句深度對比

循環類型語法結構執行順序特點適用場景
while`init; while(cond) { body; iter; }`先判斷 → 體 → 迭代 → 判斷...次數未知、可能零次讀取流、輪詢條件
do-while`init; do { body; iter; } while(cond);`體 → 判斷 → 體...至少執行一次菜單交互、至少一次嘗試
for`for(init; cond; iter) { body }`init → 判斷 → 體 → iter → 判斷...次數已知、計數器明確遍歷數組/集合、固定次數
foreach`for(E e : coll) {}`自動迭代簡潔、只讀遍歷遍歷集合/數組 (不需索引)

⚠️ 死循環陷阱

  • `while (true) {}` / `for (;;) {}` 故意無限循環。
  • `while (cond);` **分號陷阱**:循環體為空語句,真正業務代碼在外部 `{}`,導致死循環或零次執行。
  • `for` 循環體內修改計數器 (如 `i *= 0.1`) 導致邏輯錯亂,`iter` 仍會執行。

跳轉控制語句

關鍵字作用作用範圍
break完全結束當前循環 / switch可帶標籤 `label:` 結束外層循環
continue結束本次循環,進入下一次迭代可帶標籤跳過外層循環本次
return結束整個方法跨越任意層循環直接返回

四、 數組完整指南

1. 核心特性

  • 同類型:所有元素同一數據類型 (基本類型存值、引用類型存引用)。
  • 長度固定:初始化後長度不可變 (引用變量可指向新數組)。
  • 引用類型:數組對象在**堆**內存,變量在**棧**存引用 (地址)。
  • 索引從 0 開始,越界拋 `ArrayIndexOutOfBoundsException` (運行時)。

2. 定義與初始化

// 定義 (推薦格式)
int[] arr;  // 類型[] 變量名
// 或
int arr[];  // 類型 變量名[] (C 風格,不推薦)

// 靜態初始化 (指定元素,長度由系統推導)
int[] a = {5, 6, 7, 9};
int[] b = new int[] {5, 6, 7, 9};

// 動態初始化 (指定長度,元素獲取默認值: 0/null/false)
int[] prices = new int[5]; // {0,0,0,0,0}
String[] books = new String[4]; // {null,null,null,null}

3. 訪問與遍歷

// 索引訪問
for (int i = 0; i < arr.length; i++) { println(arr[i]); }

// foreach (JDK 5+)
for (int val : arr) { println(val); }
// ⚠️ foreach 中對循環變量賦值 (val = 10) 不會修改數組元素!

4. 內存模型圖解

基本類型數組:棧變量 → 堆數組對象 → **直接存值**。

引用類型數組:棧變量 → 堆數組對象 → **存引用** → 另一塊堆內存存對象實體。

數組內存模型

斷開引用 (`arr = null`) 使數組對象成為垃圾,GC 回收。

5. 多維數組本質:一維數組的數組

// 定義二維數組
int[][] matrix;

// 動態初始化:先定第一維長度
matrix = new int[3][]; // {null, null, null}

// 再逐行初始化第二維 (長度可不一 → 齒狀數組)
matrix[0] = new int[2];
matrix[1] = new int[4];
matrix[2] = new int[1];

// 靜態初始化
String[][] str2 = { new String[3], new String[]{"hello"} };
// 訪問
str2[1][0]; // "hello"

結論:Java **無真正多維數組**,只有「數組的數組」。二維 = 一維數組,元素是一維數組;三維 = 一維數組,元素是二維數組...

多維數組結構

6. Arrays 工具類 (JDK 8+ 並行增強)

int[] a = {3, -4, 25, 16, 30, 18};
Arrays.sort(a);                 // 雙軸快排 (基本類型) / TimSort (對象)
Arrays.parallelSort(a);         // 多線程並行排序 (大數組加速)
Arrays.parallelPrefix(a, (x,y)->x*y); // 並行前綴累積
Arrays.parallelSetAll(new int[5], i -> i*5); // 並行生成
println(Arrays.toString(a));    // 友好輸出 [ -4, 3, 16, 18, 25, 30 ]
println(Arrays.equals(a, b));   // 內容比較
int[] copy = Arrays.copyOf(a, 10); // 擴容復制

五、 綜合案例:五子棋棋盤 / 數字轉中文大寫金額

代碼示例見原文 `Gobang.java` (二維數組棋盤繪製、控制台交互) 與 `Num2Rmb.java` (浮點數分解、四位分組轉漢字、單位處理)。

六、 總結

  1. 流程控制:掌握三大結構、if-else 順序陷阱、switch 穿透、循環分類與跳轉語句。
  2. 數組:同類型、定長、引用類型、堆棧分離、多維本質、Arrays 工具類。
  3. 實踐:多寫代碼驗證邏輯錯誤 (如 if 順序、循環分號)、畫內存圖理解引用關系。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved