赋值运算符用于将右侧的值赋给左侧的变量,是 Java 中最基础也最常用的运算符之一。根据功能可分为两类:
=用于将右侧表达式的值赋给左侧的变量,语法:
变量 = 表达式;
// 基本类型赋值
int a = 10;
double b = 3.14;
boolean c = true;
// 引用类型赋值(赋值的是对象引用)
String str = "Hello";
int[] arr = {1, 2, 3};
// 表达式赋值
int d = a + 5; // 先计算a+5,再将结果赋给d
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2与arr1指向同一数组
arr2[0] = 100;
System.out.println(arr1[0]); // 输出100(原数组被修改)
int x, y, z;
x = y = z = 5; // 等价于 z=5; y=z; x=y;
复合赋值运算符是算术运算与赋值运算的结合,语法为变量 运算符= 表达式,等价于变量 = (变量类型)(变量 运算符 表达式)(隐含强制类型转换)。
int a = 5;
a += 3; // 等价于 a = (int)(a + 3) → a=8
// 与字符串的拼接(特殊情况)
String s = "Hello";
s += " World"; // 等价于 s = s + " World" → "Hello World"
double x = 10.5;
x -= 3; // 等价于 x = x - 3 → 7.5
int y = 5;
y -= 10; // 等价于 y = y - 10 → -5
int m = 4;
m *= 2.5; // 等价于 m = (int)(4 * 2.5) → 10(小数部分截断)
long n = 3;
n *= 5; // 等价于 n = 3 * 5 → 15
int p = 10;
p /= 3; // 等价于 p = 10 / 3 → 3(整数除法截断)
double q = 10.0;
q /= 3; // 等价于 q = 10.0 / 3 → 3.3333333333333335
int r = 10;
r %= 3; // 等价于 r = 10 % 3 → 1
int s = -10;
s %= 3; // 等价于 s = -10 % 3 → -1(余数符号与被除数一致)
复合赋值运算符会自动进行强制类型转换,这是与普通运算 + 赋值的关键区别。
// 普通运算+赋值(需显式强制转换)
byte byte1 = 10;
// byte1 = byte1 + 5; // 编译错误:int不能直接赋给byte
byte1 = (byte)(byte1 + 5); // 需显式转换
// 复合赋值(自动隐含转换)
byte byte2 = 10;
byte2 += 5; // 正确:自动转换为byte,等价于 byte2 = (byte)(byte2 + 5)
当参与运算的表达式类型与变量类型不同时:
short s = 100;
s *= 3.14; // 步骤:
// 1. s提升为double:100.0
// 2. 计算100.0 * 3.14 = 314.0
// 3. 强制转换为short:314(未溢出)
System.out.println(s); // 输出314
// 初始化
int count = 0;
// 循环中更新变量
for (int i = 0; i < 10; i++) {
count += i; // 累加求和
}
用复合赋值运算符替代冗长的运算 + 赋值,提高可读性:
// 冗长写法
total = total + price;
// 简化写法
total += price;
+=是字符串拼接的常用方式:
String info = "Name: ";
info += "Alice"; // 拼接后:"Name: Alice"
info += ", Age: " + 25; // 链式拼接:"Name: Alice, Age: 25"
int num = 5;
if (num = 10) { // 编译错误:赋值表达式结果为int,不能作为boolean条件
// ...
}
if (num == 10) { // 正确:判断num是否等于10
// ...
}
当运算结果超出变量类型范围时,会发生溢出(因隐含强制转换):
byte maxByte = Byte.MAX_VALUE; // 127
maxByte += 1; // 等价于 maxByte = (byte)(127 + 1) → -128(溢出)
System.out.println(maxByte); // 输出-128
频繁使用+=拼接字符串会产生大量临时对象,建议用StringBuilder优化:
// 低效:每次+=创建新String对象
String str = "";
for (int i = 0; i < 1000; i++) {
str += i;
}
// 高效:仅创建一个StringBuilder对象
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
String result = sb.toString();
复合赋值隐含强制转换,普通运算需显式转换:
int a = 10;
long b = 20;
a += b; // 正确:自动转换为int(可能溢出)
// a = a + b; // 编译错误:long不能直接赋给int,需显式转换
赋值运算符优先级低于其他运算符(如算术、关系、逻辑运算符),因此会最后执行:
int x = 5;
int y = x + 3 * 2; // 先算3*2=6,再算x+6=11,最后赋值给y
System.out.println(y); // 输出11
赋值运算符结合性为从右到左,支持链式赋值:
int a, b, c;
a = b = c = 10; // 执行顺序:c=10 → b=c → a=b
掌握赋值运算符的用法是 Java 编程的基础,合理使用复合赋值运算符可简化代码并避免类型转换错误。