1. 介紹
Java 是一種高度流行的程式語言,用於各種領域,包括商業系統、網頁應用程式和 Android 應用程式開發。學習 Java 時,您將遇到的第一個基本元素之一是「運算子」。運算子是用來在程式中執行計算或比較的必要符號和規則,它們在任何 Java 程式碼庫中都頻繁出現。 許多搜尋「Java 運算子」關鍵字的人可能面臨以下問題:
- 想要整理不同類型和意義的運算子
- 想要看到運算子使用的具體範例
- 想要了解運算子之間的差異和注意事項
本文系統性地解釋 Java 中使用的主要運算子,從基礎到實際應用,以清晰且適合初學者的方式涵蓋一切。它還總結了常見錯誤、重要考量和實務開發的有用提示。掌握運算子是撰寫可讀性和低錯誤程式碼的第一步。 無論您是剛開始學習 Java 還是複習基礎,本文旨在成為您遇到問題時的「首選參考」。透過範例和圖表,我們將幫助您完全理解 Java 運算子。 請閱讀至最後,鞏固您對 Java 運算子的掌握。
2. Java 運算子概覽(含快速參考表格)
Java 提供了多種用途的分類運算子。在這裡,我們整理了 Java 中使用的代表性運算子,以幫助您掌握大局。首先,讓我們看一個快速參考表格,一眼就能看到每個運算子的角色和符號。 Java 運算子快速參考表格
| Category | Operator Examples | Main Usage | Sample Code |
|---|---|---|---|
| Arithmetic Operators | +, -, *, /, % | Numeric calculations | a + b, x % y |
| Assignment Operators | =, +=, -=, *=, /= | Assigning and updating values | x = 5, y += 2 |
| Comparison Operators | ==, !=, >, <, >=, <= | Value comparison | a == b, x >= y |
| Logical Operators | &&, ||, ! | Logical evaluation | (x > 0 && y < 10) |
| Bitwise Operators | &, |, ^, ~, <<, >>, >>> | Bit-level operations | x & y, x << 1 |
| Increment / Decrement | ++, — | Increase or decrease values | i++, –j |
| Ternary Operator | ? : | Conditional value switching | max = (a > b) ? a : b |
| Others | instanceof | Type checking | obj instanceof String |
Java 運算子用於各種情境,如計算、比較和條件分支。算術、賦值、比較和邏輯運算子幾乎出現在每個程式中。
位元運算子、三元運算子和 instanceof 運算子較為進階,但學習它們能大大擴展您在 Java 中的表達能力。
在接下來的章節中,我們將解釋每個運算子類別,並提供您可以立即使用的實際範例。
3. 每個運算子類別的解釋與實際範例
Java 提供了許多不同類型的運算子。在本節中,我們將解釋每個類別的使用方式、特徵、範例和常見陷阱。請確保理解每個運算子類型的獨特行為。
3-1. 算術運算子 (+, -, *, /, %)
算術運算子用於執行數值計算。它們是加法、減法、乘法、除法和餘數計算等任務的基礎操作。
+(加法):將兩個數值相加。與字串一起使用時,執行串接。-(減法):計算兩個數字之間的差異。*(乘法):將兩個數字相乘。/(除法):將左運算元除以右運算元。整數除法會捨棄小數部分。%(模數):返回除法的餘數。
範例:
int a = 10;
int b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3 (decimal part is discarded)
System.out.println(a % b); // 1
注意事項:
- int 值之間的除法會產生整數輸出(捨棄小數部分)。
- 使用
+運算子與字串會產生串接,而不是算術加法。
3-2. 賦值運算子 (=, +=, -=, *=, /=, %=)
賦值運算子用於設定或更新變數的值。複合賦值運算子有助於使程式碼更簡潔。
=(賦值):將右側的值賦值給左側的變數。+=(加法並賦值):將右側的值相加並重新賦值結果。- 其他複合運算子包括
-=、*=、/=、%=。
範例:
int x = 5;
x += 3; // Equivalent to x = x + 3 → x becomes 8
x *= 2; // Equivalent to x = x * 2 → x becomes 16
重點:
- 複合賦值運算子在重複計算或迴圈操作時特別有用。
3-3. 比較運算子 (==, !=, >, <, >=, <=) 與 instanceof
比較運算子用來檢查值是否符合指定條件。
==(等於):檢查兩個值是否相等。!=(不等於):檢查兩個值是否不同。>、<、>=、<=:比較大小。instanceof:檢查物件是否為特定類型的實例。
範例:
int a = 5, b = 7;
System.out.println(a == b); // false
System.out.println(a < b); // true
String str = "hello";
System.out.println(str instanceof String); // true
重要說明:
- 若要比較字串或物件的內容,請使用
equals()。==運算子比較的是參考(是否指向同一個實例)。
3-4. 邏輯運算子 (&&, ||, !)
當需要評估組合條件時使用邏輯運算子。
&&(AND):僅在兩個條件皆為 true 時回傳 true。||(OR):只要其中一個條件為 true 就回傳 true。!(NOT):將布林值取反。
範例:
int age = 20;
boolean isMember = true;
System.out.println(age >= 18 && isMember); // true
System.out.println(!(age < 18)); // true
短路求值:
&&與||會在左側條件已決定結果時,跳過右側的求值。
3-5. 位元運算子 (&, |, ^, ~, <<, >>, >>>)
位元運算子在位元層面上操作整數值,常用於系統開發或效能關鍵的處理。
&(AND):兩位皆為 1 時回傳 1。|(OR):任一位為 1 時回傳 1。^(XOR):只有其中一位為 1 時回傳 1。~(NOT):將所有位元取反。<<(左移):將位元向左移動。>>(右移):有符號右移。>>>(無符號右移)
範例:
int x = 5; // 0101
int y = 3; // 0011
System.out.println(x & y); // 1 (0001)
System.out.println(x | y); // 7 (0111)
System.out.println(x ^ y); // 6 (0110)
System.out.println(~x); // -6
System.out.println(x << 1); // 10
3-6. 增減運算子 (++, –)
這些運算子會將變數的值增加或減少 1。前置遞增/遞減與後置遞增/遞減的行為不同。
++:增加 1。--:減少 1。
範例:
int i = 0;
i++; // i becomes 1
++i; // i becomes 2
前置 vs 後置:
++i先遞增,然後回傳遞增後的值。i++先回傳目前的值,之後再遞增。
3-7. 三元運算子 (? 🙂
三元運算子允許你在單行表達式中寫出條件邏輯。
語法:
condition ? value_if_true : value_if_false
範例:
int max = (a > b) ? a : b;
小技巧:
- 它可以簡化程式碼,但對於複雜條件請避免過度使用。
4. 運算子優先順序與結合性
當同一表達式中出現多個運算子時,Java 會依照稱為「運算子優先順序」的規則來評估。此外,當具有相同優先順序的運算子同時出現時,評估的先後順序由「結合性」決定。若誤解這些規則,程式碼可能會產生意外結果或錯誤。
4-1. 運算子優先順序表
以下表格列出主要 Java 運算子依優先順序排列。數字越小表示優先順序越高。
| Precedence | Operators | Main Usage | Associativity |
|---|---|---|---|
| 1 | () | Grouping with parentheses | Left to Right |
| 2 | ++, --, !, ~, +, - | Unary operators | Right to Left |
| 3 | *, /, % | Multiplication, division, remainder | Left to Right |
| 4 | +, - | Addition, subtraction | Left to Right |
| 5 | <<, >>, >>> | Shift operations | Left to Right |
| 6 | <, <=, >, >=, instanceof | Comparison and type checking | Left to Right |
| 7 | ==, != | Equality and inequality | Left to Right |
| 8 | & | Bitwise AND | Left to Right |
| 9 | ^ | Bitwise XOR | Left to Right |
| 10 | | | Bitwise OR | Left to Right |
| 11 | && | Logical AND | Left to Right |
| 12 | || | Logical OR | Left to Right |
| 13 | ? : | Ternary (conditional) operator | Right to Left |
| 14 | =, +=, -=, other assignment operators | Assignment | Right to Left |
4-2. 視覺化優先順序與結合性
考慮以下表達式:
int result = 2 + 3 * 4;
因為 *(乘法)的優先順序高於 +(加法),所以先計算乘法:
3 * 4 = 12,
接著計算 2 + 12 = 14。
4-3. 使用括號明確控制優先順序
當表達式變得複雜或你想確保清晰時,請始終使用括號 () 來明確控制運算順序。
範例:
int result = (2 + 3) * 4; // 2+3 is evaluated first → result becomes 20
4-4. 常見錯誤與重要說明
- 錯誤的優先順序假設可能導致意外結果。
範例:
boolean flag = a > 0 && b < 10 || c == 5;- 因為
&&的優先順序高於||,此表達式等價於:(a > 0 && b < 10) || c == 5 - 為避免錯誤,務必在複雜表達式中使用括號。
- 因為
運算子優先順序與結合性常讓初學者感到困惑,但只要了解規則,就能撰寫更可預測且可靠的 Java 程式碼。
5. 常見錯誤與常見陷阱
雖然 Java 運算子看似簡單,初學者與中階開發者常會遇到意外行為與細微錯誤。本節彙總了與運算子相關的常見實務錯誤與典型陷阱。
5-1. 整數除法的意外結果
在 Java 中對兩個 int 值相除時,結果永遠是整數——小數部分會被捨棄。
int a = 5;
int b = 2;
System.out.println(a / b); // Output: 2
如果想要得到小數結果,請將其中一個運算元轉型為 double(或 float):
System.out.println((double)a / b); // Output: 2.5
5-2. 浮點精度問題
使用 double 或 float 可能會產生細微的四捨五入誤差。
double d = 0.1 + 0.2;
System.out.println(d); // Output example: 0.30000000000000004
對於需要嚴格精確的計算(例如金融金額),請改用 BigDecimal。
5-3. == 與 equals() 的差異
在比較物件(如字串)時,常見的錯誤是混淆 == 與 equals() 的差別。
==:比較兩個參考是否指向同一個實例。equals():比較物件的實際內容(值或文字)。String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1 == s2); // false (different instances) System.out.println(s1.equals(s2)); // true (contents are identical)
5-4. 短路求值導致的副作用遺失
邏輯運算子 && 與 || 會使用「短路求值」,即當左側已決定結果時,右側表達式會被跳過。
若未了解此行為,預期的副作用(如變數更新或方法呼叫)可能永遠不會發生。
int a = 0;
if (a != 0 && 10 / a > 1) {
// This block is never executed
}
此例中,因為 a != 0 為 false,10 / a 表達式不會被評估,從而避免除以零的錯誤。

5-5. 缺少括號導致的邏輯錯誤
在複雜條件表達式中省略括號,常因優先順序誤解而導致錯誤的評估結果。
boolean flag = a > 0 && b < 10 || c == 5;
// Intended meaning: ((a > 0) && (b < 10)) || (c == 5)
// But depending on context, interpretation may differ
5-6. 小結
- 始終確認資料型別(int 與 double)以及比較方式(== 與 equals)。
- 養成在複雜表達式中使用括號的習慣。
- 注意 Java 特有的行為,例如短路求值。
只要記住這些要點,就能大幅減少 Java 中常見的運算子相關錯誤。
6. 實作範例:運算子範例程式碼
本節介紹實務範例程式碼,說明 Java 運算子在真實開發情境中的使用方式。這些範例突顯常見的使用情境,協助加深理解並提升實作能力。
6-1. 在 if 陳述式中使用比較與邏輯運算子
在結合多個條件進行分支時,比較與邏輯運算子是必不可少的。
int age = 25;
boolean isMember = true;
if (age >= 18 && isMember) {
System.out.println("Service is available.");
} else {
System.out.println("Conditions not met.");
}
6-2. 在迴圈中使用遞增運算子
遞增 (++) 與遞減 (–) 運算子在迴圈處理計數器時常被使用。
for (int i = 0; i < 5; i++) {
System.out.println("Count: " + i);
}
6-3. 使用三元運算子簡化條件賦值
三元運算子讓您在不寫完整 if 陳述式的情況下直接賦值。
int score = 75;
String result = (score >= 60) ? "Pass" : "Fail";
System.out.println(result); // Pass
6-4. 使用複合賦值運算子簡化程式碼
複合賦值運算子在重複更新變數值時非常實用。
int total = 0;
for (int n = 1; n <= 10; n++) {
total += n; // Equivalent to total = total + n
}
System.out.println("Total: " + total);
6-5. 實用的位元運算子範例:管理旗標
位元運算在有效管理多個 ON/OFF 旗標時相當有用。
int FLAG_READ = 1; // 0001
int FLAG_WRITE = 2; // 0010
int FLAG_EXEC = 4; // 0100
int permission = FLAG_READ | FLAG_WRITE; // 0011
// Check if write permission exists
if ((permission & FLAG_WRITE) != 0) {
System.out.println("Write permission granted.");
}
6-6. 在實務情境中結合多種運算子
當條件變得複雜時,使用括號以避免歧義。
int a = 3, b = 7, c = 5;
if ((a < b && b > c) || c == 5) {
System.out.println("Condition satisfied.");
}
6-7. 撰寫可讀程式碼的技巧
- 將複雜的表達式拆解成較小、較易讀的部分。
- 使用括號明確說明運算順序。
- 為變數命名並撰寫能清楚傳達意圖的註解。
自行執行這些範例程式,能加深您對運算子的理解。當您能自由運用各種運算子時,Java 開發將變得更有效率且更有趣。
7. 小結
到目前為止,我們已涵蓋 Java 中主要的運算子——從基本概念到實務應用。運算子是程式內執行計算、評估與資料操作的基礎。正確理解與使用它們,可讓程式碼更高效且減少錯誤。
7-1. 本文回顧
- Java 提供多種運算子類型,如算術、賦值、比較、邏輯、位元、三元、遞增/遞減,以及
instanceof,每種都有不同的用途與行為。 - 了解 Java 特有的規則——例如運算子優先順序、結合性與短路求值——有助於避免意外的錯誤。
- 透過實作範例(如
if陳述式、迴圈與條件分支)來學習,可加深概念的掌握。 - 必須留意常見錯誤,例如資料型別混淆,或在物件比較時誤用
==而非equals()。
7-2. 學習建議
學習運算子運作最有效的方式是自行撰寫程式並執行。嘗試輸入並執行本文所介紹的範例程式,親自體驗其行為。
每當遇到疑問或不確定之處,養成查閱文件或可靠技術資源的習慣,以鞏固您的理解。
掌握 Java 運算子的基礎,將讓您在開發任何 Java 程式時更有信心。將此知識運用於持續的學習與成長中。
8. 常見問題 (FAQ)
本節涵蓋學習者與在職開發者常見的 Java 運算子問題。利用以下答案加深理解,並快速解決疑惑。
Q1. 哪個運算子用於字串串接?
A1. 使用 + 運算子進行字串串接。
例如,"Hello" + " World" 會得到 "Hello World"。
當字串與數字串接時,結果會變成字串。
Q2. == 運算子與 equals() 方法有何差別?
A2.
==比較兩個參考是否指向同一個物件實例。equals()比較物件內部的內容。
對於像 String 這類物件,若要比較值,請始終使用 equals()。
Q3. 前置遞增 (++i) 與後置遞增 (i++) 運算子有何不同?
A3.
- 前置遞增(
++i):先遞增值,然後回傳更新後的值。 - 後置遞增(
i++):先回傳目前的值,之後再遞增。int i = 5; System.out.println(++i); // Outputs 6 System.out.println(i++); // Outputs 6, then i becomes 7
Q4. 什麼是邏輯運算子的短路求值?
A4. 邏輯運算子 && 與 || 會在左側已決定最終結果時,跳過右側表達式的求值。
這可避免不必要的計算,並防止可能的錯誤(例如除以零)。
Q5. 如何明確改變運算子優先順序?
A5. 使用圓括號 ()。
圓括號會強制先求值括號內的部分,使複雜表達式更清晰且更安全。
int result = (2 + 3) * 4; // 2+3 is evaluated first
Q6. 在哪些情境下會使用位元運算子?
A6. 位元運算子在以下情況特別有用:
- 標誌(Flag)管理
- 硬體層級控制
- 需要效能優化的計算
例如,可將多個開/關狀態有效率地儲存在單一整數中。
Q7. 我可以在 Java 中自訂運算子嗎?
A7. Java 不支援像 C++ 那樣的自訂運算子或運算子重載。
不過,你可以透過自行撰寫方法來實作等效的行為。
在持續練習的過程中,可能會產生其他問題。屆時,請參考官方文件或可信的學習資源,以深化理解。
9. 參考連結與官方外部資源
想更深入探討 Java 運算子或驗證官方規範的讀者,以下提供一系列可靠的參考與學習資源。這些連結在實務開發或研究時也相當有用。
9-1. 官方文件
- Java SE Documentation(英文,官方) – 針對運算子規範、求值規則與表達式行為的完整說明。
- Java Platform SE 8 API Documentation(英文,官方) – 查詢類別與方法詳細資訊的好幫手。
9-2. 有用的外部學習資源
- Dotinstall – Java 基礎(日文) – 針對 Java 基礎概念的入門影片教學。
- Progate – Java 課程(日文) – 以互動方式練習 Java 基礎的實作平台。
- Qiita – Java 標籤文章列表(日文) – 含實務技巧、範例與最新社群知識的文章彙整。
9-3. 想要更進一步學習的讀者
使用說明
上述連結為 2025 年 5 月止的主要學習資源與官方參考。
由於內容與 URL 未來可能變動,請定期檢查是否有最新更新。
結合本篇文章與這些資源,你可以進一步深化對 Java 運算子的理解,並提升實務開發能力。
