Java基础之深拷贝浅拷贝-Integer

如果将一个对象浅拷贝,被拷贝的对象中,有个属性是Integer类型的,新对象修改这个属性,原对象属性会被修改吗

如果按照普通对象方式思考,那肯定是会被修改的,因为对象嘛,修改的是实例对象,而不是引用。

但是呢,Integer却并不是普通对象的方式。

所以答案是:不会! 修改新对象中的 Integer 属性,不会影响原对象。

虽然 Integer 是引用类型,但因为它是不可变的,所以在浅拷贝中,赋新值不会影响原对象。 、

Java 复制代码
class Person implements Cloneable {
    Integer age;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); // 浅拷贝
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Person p1 = new Person();
        p1.age = 25;

        Person p2 = (Person) p1.clone(); // 浅拷贝
        p2.age = 30; // 修改的是新对象的 age

        System.out.println("p1.age = " + p1.age); // 👉 25
        System.out.println("p2.age = " + p2.age); // 👉 30
    }
}

为什么是这样?

  • p2.age = 30; 实际上是 p2.age = new Integer(30);
  • 并不会修改 p1.age 指向的那个 Integer(25) 对象
  • Integer、String、Long 等都是不可变对象,即便是浅拷贝,只要你赋值,就是新的引用,不影响原来的。

浅拷贝时的行为 Integer 与其他对象的不同点:

浅拷贝时的核心逻辑是:对象字段的引用地址被直接复制,不会递归拷贝引用指向的对象属性。所以,如果一个对象中包含了一个 Integer 字段,那么浅拷贝会复制引用地址**;

p1.age 和 p2.age 指向的是同一个 Integer(25) 对象(引用一样)但是 ⚠️:虽然引用一样,但 Integer 是不可变对象,你不能直接修改里面的值,只能"替换引用":p2.age = 30; 这不是修改原对象,而是让 p2.age 指向另一个 Integer 对象,所以并不会影响 p1.age。

场景 1:浅拷贝(a 与 b 指向同一对象)

flowchart LR A[a] --> O1["Integer 100(缓存对象)"] B[b] --> O1

场景 2:new 强制创建新对象

flowchart LR A[a] --> O1["Integer 100(缓存对象)"] C[c] --> O2["Integer 100(新对象)"]

场景 3:超出缓存范围(200 不在 -128~127)

flowchart LR X[x] --> O3[Integer 200] Y[y] --> O4[Integer 200]

总结:

Integer 是一个不可变对象(immutable)

  1. Integer 是不可变对象

    • Integer 内部只存一个 final int value,一旦创建之后就不能修改。
    • 所以拷贝 Integer 变量其实只是拷贝了一个引用,本质上所有引用的都是同一个对象。
    • 由于Integer值是不可变 的,赋值/修改时其实是新建一个对象
  2. 所谓"浅拷贝"

    • 如果你做 Integer a = 100; Integer b = a;,只是把引用赋值给了 b,两个变量指向同一个对象。
    • 这就是"浅拷贝"的效果。
  3. 不存在"深拷贝"

    • 因为 Integer 内部没有可变引用对象,只有 int value,而且是 final,无法更改,所以没有深拷贝的必要。
相关推荐
wuminyu7 分钟前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ1 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
wbs_scy2 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo4 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup4 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952365 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.5 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19435 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12215 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px5 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋