目录
[1. 基本算术运算符(二元)](#1. 基本算术运算符(二元))
[2. 自增 / 自减运算符(一元)](#2. 自增 / 自减运算符(一元))
[1. 隐式转换(自动类型转换)](#1. 隐式转换(自动类型转换))
[2. 强制转换(显式类型转换)](#2. 强制转换(显式类型转换))
[三、字符串和字符的 "+" 操作](#三、字符串和字符的 “+” 操作)
[1. 基本赋值运算符(=)](#1. 基本赋值运算符(=))
[2. 复合赋值运算符](#2. 复合赋值运算符)
[1. 基本逻辑运算符(非短路)](#1. 基本逻辑运算符(非短路))
[2. 短路逻辑运算符](#2. 短路逻辑运算符)
运算符是 Java 中用于执行运算的特殊符号,是程序逻辑实现的基础。根据功能不同,Java 运算符可分为算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符等,且各类运算符存在明确的优先级规则。本文将系统总结各类运算符的特性、使用场景及注意事项。
一、算术运算符
算术运算符用于执行基本的数学运算,包括二元运算符 (需两个操作数)和一元运算符(需一个操作数)。
1. 基本算术运算符(二元)
| 运算符 | 功能 | 示例 | 说明 |
|---|---|---|---|
| + | 加法 | 3 + 5 = 8 |
数字相加或字符串 / 字符拼接(见后文) |
| - | 减法 | 10 - 4 = 6 |
数字相减 |
| * | 乘法 | 2 * 6 = 12 |
数字相乘 |
| / | 除法 | 7 / 2 = 3 |
整数除法取商(非四舍五入);浮点数除法正常计算(7.0 / 2 = 3.5) |
| % | 取模(余) | 7 % 2 = 1 |
结果符号与被除数一致(-7 % 2 = -1,7 % -2 = 1) |
2. 自增 / 自减运算符(一元)
用于操作数自身加 1 或减 1,分为前缀 (先运算后使用)和后缀(先使用后运算)两种形式。
| 运算符 | 功能 | 前缀示例(++a) | 后缀示例(a++) |
|---|---|---|---|
| ++ | 自增(+1) | int a=3; int b=++a; → a=4, b=4 |
int a=3; int b=a++; → a=4, b=3 |
| -- | 自减(-1) | int a=3; int b=--a; → a=2, b=2 |
int a=3; int b=a--; → a=2, b=3 |
注意 :自增 / 自减运算符仅能作用于变量(如5++为错误写法),且在复杂表达式中需注意优先级(见后文)。
二、类型转换(隐式与强制)
当不同数据类型的操作数参与运算时,会发生类型转换,确保运算统一。
1. 隐式转换(自动类型转换)
-
规则 :小范围类型自动转换为大范围类型(避免精度损失),转换顺序为:
byte → short → int → long → float → double(char可转换为int,因字符对应 ASCII 码)。 -
示例 :
int a = 10; long b = a; // 正确:int(4字节)→ long(8字节) float c = 3.14f; double d = c; // 正确:float → double
2. 强制转换(显式类型转换)
-
规则 :大范围类型需手动转换为小范围类型,语法为
(目标类型) 操作数。 -
注意:可能导致精度损失或溢出(需手动控制风险)。
-
示例 :
double a = 3.9; int b = (int) a; // 结果为3(精度损失) long c = 10000000000L; int d = (int) c; // 结果为-2147483648(溢出,因int范围为-2^31~2^31-1)
一个练习进行记忆

三、字符串和字符的 "+" 操作
"+" 在 Java 中除算术加法外,还可用于字符串拼接或字符与其他类型的混合运算,规则如下:
-
字符串与任何类型拼接 :结果为字符串(其他类型自动转换为字符串)。
示例:
String s = "age: " + 18; // 结果为 "age: 18" String s2 = "a" + true; // 结果为 "atrue" -
多个 "+" 连续运算 :从左到右执行,若左侧出现字符串,则后续均为拼接;否则先执行算术运算。
示例:
int a = 10; String s3 = 5 + 3 + "a"; // 先算5+3=8,再拼接 → "8a" String s4 = "a" + 5 + 3; // 从左到右拼接 → "a53" -
字符(char)与数字相加 :char 会转换为对应 ASCII 码(int 类型),执行算术加法。
示例:
char c = 'a'; // ASCII码为97 int sum = c + 1; // 结果为98('b'的ASCII码)
四、赋值运算符
赋值运算符用于将右侧值赋给左侧变量,包括基本赋值 和复合赋值。
1. 基本赋值运算符(=)
- 功能:将右侧表达式结果赋给左侧变量(左侧必须是可修改的变量,不能是常量)。
- 示例:
int a = 5;
2. 复合赋值运算符
复合赋值是 "算术运算 + 赋值" 的简写,语法为 变量 运算符= 操作数,等价于 变量 = (变量类型)(变量 运算符 操作数)(隐含强制转换)。
| 运算符 | 等价写法 | 示例 |
|---|---|---|
| += | a += b → a = (a类型)(a + b) |
short s=1; s += 2; → 正确(隐含 short 转换) |
| -= | a -= b → a = (a类型)(a - b) |
int a=5; a -= 3; → a=2 |
| *= | a *= b → a = (a类型)(a * b) |
double d=2; d *= 3; → d=6 |
| /= | a /= b → a = (a类型)(a / b) |
int a=10; a /= 3; → a=3 |
| %= | a %= b → a = (a类型)(a % b) |
int a=7; a %= 3; → a=1 |
注意 :复合赋值的隐含强制转换可避免部分类型错误,例如 short s=1; s = s + 2; 会报错(s+2 为 int),但 s += 2 正确。
五、关系运算符
关系运算符用于判断两个操作数的关系,结果为boolean 类型 (true 或 false)。
| 运算符 | 功能 | 示例 |
|---|---|---|
| == | 等于 | 3 == 5 → false |
| != | 不等于 | 3 != 5 → true |
| > | 大于 | 5 > 3 → true |
| < | 小于 | 5 < 3 → false |
| >= | 大于等于 | 5 >= 5 → true |
| <= | 小于等于 | 3 <= 2 → false |
注意:
- 区分
==(判断相等)和=(赋值),例如if(a=3)会恒为true(因赋值结果为 3,非 0 即真),是常见错误。 - 引用类型的
==判断地址是否相同,而非内容(内容判断需用equals()方法)。
六、逻辑运算符
逻辑运算符用于连接 boolean 表达式,执行逻辑判断,结果为 boolean 类型。
1. 基本逻辑运算符(非短路)
| 运算符 | 功能 | 运算规则(a、b 为 boolean) | 示例 | ||
|---|---|---|---|---|---|
| & | 逻辑与(且) | 全为 true 则 true,否则 false | true & false → false |
||
| 逻辑或(或) | 至少一个 true 则 true,全 false 则 false | `true | false → true` | ||
| ! | 逻辑非(取反) | true→false,false→true | !true → false |
||
| ^ | 逻辑异或 | 两个结果不同则 true,相同则 false | true ^ true → false |
特点 :无论左侧结果如何,右侧表达式都会执行(例如 (3>5) & (a++)>0 中,a++ 会执行)。
2. 短路逻辑运算符
| 运算符 | 功能 | 运算规则(a、b 为 boolean) | 示例 | ||||
|---|---|---|---|---|---|---|---|
| && | 短路与 | 左侧为 false 时,右侧不执行,结果为 false;左侧为 true 时,需判断右侧 | (3>5) && (a++)>0 → a不变 |
||||
| 短路或 | 左侧为 true 时,右侧不执行,结果为 true;左侧为 false 时,需判断右侧 | `(3<5) | (a++)>0→a` 不变 |
优势 :短路特性可提高效率(避免无用计算),例如 if(obj != null && obj.getValue() > 0) 可避免空指针异常(若 obj 为 null,右侧不执行)。
七、三元运算符
三元运算符是 Java 中唯一的三目运算符,语法为:
条件表达式 ? 表达式1 : 表达式2
-
功能:条件表达式为 true 时,执行表达式 1;否则执行表达式 2。
-
示例:
int max = (5 > 3) ? 5 : 3; // 结果为5 String res = (score >= 60) ? "及格" : "不及格"; -
注意 :表达式 1 和表达式 2 的类型必须兼容(可自动转换或显式转换),否则编译报错。例如
(3>2) ? 1 : 2.0会报错(int 与 double 不兼容)。
八、运算符优先级
当多个运算符混合使用时,优先级决定执行顺序(优先级高的先执行),可通过括号 () 改变优先级(括号优先级最高)。从高到低的优先级顺序如下:
- 括号:
() - 单目运算符:
++、--、! - 算术运算符:
*、/、%(高于+、-) - 关系运算符:
>、<、>=、<=(高于==、!=) - 逻辑运算符:
!(高于&&,&&高于||) - 三元运算符:
? : - 赋值运算符:
=、+=、-=等
示例:
int a = 3;
int b = 5;
int c = a + b * 2; // 先算b*2=10,再算a+10 → 13
int d = (a + b) * 2; // 括号优先,先算a+b=8,再*2 → 16
boolean e = a > 2 && b < 4 || !false; // 等价于 (a>2 && b<4) || true → false || true → true
九、总结
Java 运算符是程序逻辑的基础,掌握各类运算符的功能、转换规则、短路特性及优先级,可避免常见错误(如整数除法精度问题、短路逻辑的副作用、== 与 = 混淆等)。实际开发中,建议通过括号明确运算顺序,提高代码可读性。
通过合理使用运算符,能高效实现数值计算、逻辑判断、变量赋值等核心功能,是 Java 编程的必备技能。
