源本科技 | 码上会

Java 赋值运算符

2025/12/25
15
0

赋值运算是编程中最基本的操作之一。Java 提供了简单赋值复合赋值两类赋值运算符,不仅用于变量初始化,还能简化代码、提升可读性,并在特定场景下自动处理类型转换。本文将系统讲解 Java 中的赋值运算符及其核心特性。


学习目标

  • 掌握 = 和 5 种复合赋值运算符(+=, -=, *=, /=, %=)的用法

  • 理解右结合性类型兼容性规则

  • 深入理解复合赋值运算符的隐式类型转换机制

  • 避免因类型不匹配导致的编译错误


什么是赋值运算符?

赋值运算符用于将右侧的值赋予左侧的变量。其通用格式为:

variable = value;

核心规则

  1. 左操作数必须是变量(不能是常量或表达式)

  2. 右操作数必须与左操作数类型兼容

  3. 具有右结合性a = b = c 等价于 a = (b = c)

✅ 赋值运算符是 Java 表达式的基础,几乎所有变量操作都离不开它。


1. 简单赋值运算符(=

最基本的赋值形式,直接将右侧值存入左侧变量。

语法

variable = expression;

示例

int num = 10;
String name = "GeeksforGeeks";

完整程序

class Assignment {
    public static void main(String[] args) {
        int num;
        String name;

        num = 10;
        name = "Lusifer";

        System.out.println("num is assigned: " + num);      // 10
        System.out.println("name is assigned: " + name);    // Lusifer
    }
}

⚠️ 类型检查严格

int x = 10.5; // 编译错误!double 不能直接赋给 int

2. 复合赋值运算符

复合赋值运算符将算术运算赋值合并为一个操作,使代码更简洁。

运算符

含义

等价形式

+=

加后赋值

a = a + b

-=

减后赋值

a = a - b

*=

乘后赋值

a = a * b

/=

除后赋值

a = a / b

%=

取模后赋值

a = a % b


2.1 加赋值(+=

将右侧值加到左侧变量上,并将结果存回左侧。

语法

a += b;  // 等价于 a = a + b;

示例

int num1 = 10, num2 = 20;
num1 += num2; // num1 = 30

完整程序

class Assignment {
    public static void main(String[] args) {
        int num1 = 10, num2 = 20;
        System.out.println("num1 = " + num1); // 10
        System.out.println("num2 = " + num2); // 20
        num1 += num2;
        System.out.println("num1 = " + num1); // 30
    }
}

2.2 减赋值(-=

从左侧变量中减去右侧值,并将结果存回。

int num1 = 10, num2 = 20;
num1 -= num2; // num1 = -10

2.3 乘赋值(*=

将左侧变量与右侧值相乘,并将结果存回。

int num1 = 10, num2 = 20;
num1 *= num2; // num1 = 200

2.4 除赋值(/=

将左侧变量除以右侧值(取商),并将结果存回。

int num1 = 20, num2 = 10;
num1 /= num2; // num1 = 2

2.5 模赋值(%=

将左侧变量对右侧值取余,并将余数存回。

int num1 = 5, num2 = 3;
num1 %= num2; // num1 = 2

关键特性

这是 Java 赋值运算符中最易被忽视但极其重要的特性!

问题场景

int x = 5;
x = x + 4.5;   // ❌ 编译错误:incompatible types
x += 4.5;      // ✅ 正确!输出 9

原因分析

方式

行为

结果

x = x + 4.5

int + double → double,但 double 不能直接赋给 int

编译错误

x += 4.5

自动执行 x = (int)(x + 4.5)

成功,结果为 9

复合赋值运算符会自动进行窄化转换,相当于插入了显式类型转换。

适用范围

该特性适用于所有复合赋值运算符:

  • +=, -=, *=, /=, %=

示例验证

byte b = 10;
b += 5;     // ✅ 相当于 b = (byte)(b + 5)
// b = b + 5; // ❌ 错误:int 不能赋给 byte

💡 最佳实践:在涉及不同类型混合运算时,优先使用复合赋值以避免显式强制转换。


综合示例

public class AssignmentOperatorsDemo {
    public static void main(String[] args) {
        int a = 10;
        double d = 5.7;

        // 简单赋值
        int x = a;
        System.out.println("x = " + x); // 10

        // 复合赋值(整数)
        a += 5;   // 15
        a *= 2;   // 30
        a %= 7;   // 2 (30 % 7 = 2)
        System.out.println("a after operations: " + a); // 2

        // 复合赋值(混合类型 - 自动转换)
        int y = 10;
        y += 3.8; // 相当于 y = (int)(10 + 3.8) = 13
        System.out.println("y = " + y); // 13

        // 字符串拼接也支持 +=
        String str = "Hello";
        str += " World!";
        System.out.println(str); // Hello World!
    }
}

🔔 注意:+= 也可用于字符串拼接,这是 Java 的特殊重载行为。


常见误区

误区

正确理解

认为 a += ba = a + b 完全等价

不同类型运算时,前者有隐式转换,后者没有

忽略除零风险

a /= 0 会导致运行时异常(整数)或 Infinity(浮点)

在不可变对象上使用 +=

String+= 实际创建新对象,性能较低(应使用 StringBuilder

final 变量重复赋值

final int x = 5; x += 1; → 编译错误


重点总结

运算符

功能

是否支持隐式窄化转换

=

简单赋值

❌ 不支持

+=

加后赋值

✅ 支持

-=

减后赋值

✅ 支持

*=

乘后赋值

✅ 支持

/=

除后赋值

✅ 支持

%=

取模后赋值

✅ 支持

核心记忆点复合赋值 = 运算 + 赋值 + 自动类型转换


思考题

  1. 为什么以下代码能编译通过?请解释其底层转换过程:

    short s = 10;
    s *= 2.5;
    System.out.println(s); // 输出 25
  2. 编写一个程序,使用复合赋值运算符计算一个数的平方、立方和四次方,并输出结果。

  3. 如果 int x = 100; x /= 3;,最终 x 的值是多少?这体现了整数除法的什么特性?