JAVA的赋值与引用

1. 对象变量存储的是引用(地址),而非对象本身

Java 中的对象变量(如List aString str)本质上是一个指向内存中对象的引用,而非对象本身。可以将引用想象成一个 “遥控器”,通过它可以操作真正的对象(位于堆内存中)。

示例图示

java

List list = new ArrayList<>();

  • list 是一个变量,存储在栈内存中,值为一个引用(如 0x123456)。
  • new ArrayList<>() 创建的对象本体存储在堆内存中,地址为 0x123456
  • list 变量通过引用 0x123456 指向堆中的对象。

2. 赋值操作传递的是引用的副本,而非对象的复制

当执行赋值语句(如 a = b)时,Java 会复制引用的值(即地址),而非对象本身。这意味着两个变量将指向同一个对象

示例代码
List a = new ArrayList<>();  // a指向对象O1
List b = a;                  // b复制了a的引用,也指向O1

  • 内存状态
    • a 和 b 都存储引用 0x123456(假设 O1 的地址)。
    • 堆中只有一个对象 O1
关键区别
  • 引用传递(Java 采用):
    a = b;  // a和b指向同一对象
    
  • 对象复制(需显式调用方法,如 clone()):
    a = new ArrayList<>(b);  // 创建新对象O2,内容与b相同
    

3. 通过不同引用修改对象会影响同一个实例

由于多个变量指向同一个对象,对其中一个引用的修改会反映到所有引用上。

示例代码
List a = new ArrayList<>();
a.add("A");

List b = a;    // a和b指向同一对象
b.add("B");

System.out.println(a.size());  // 输出2,因为a和b操作的是同一个对象
执行流程
  1. a.add("A"):对象 [A]
  2. b = ab 指向 [A]
  3. b.add("B"):对象变为 [A, B]
  4. a.size() 返回 2,因为 a 和 b 指向同一对象。

你可能感兴趣的:(java,java,开发语言)