深拷贝 浅拷贝 之 (成员对象)

结论:

浅拷贝:

基本数据类型,创建新的

引用对象,复制原本的,指向相同的内存

深拷贝:

基本数据类型,创建新的

引用对象:创建新的引用对象

深拷贝 浅拷贝 测试代码

public class DeepAndShallowCopy {
    public static void main(String[] args) throws CloneNotSupportedException {
        A a = new A();
        a.a = 10;
        a.b = new B(20);

        // 1. 引用赋值(不是拷贝)
        A refCopy = a;

        // 2. 浅拷贝 创建新的引用
        A shallowCopy = a.clone();

        // 3. 深拷贝(需自定义实现)
        A deepCopy = a.deepClone();

        System.out.println("Original: " + a + ", a=" + a.a + ", b=" + a.b.value);
        System.out.println("Ref Copy: " + refCopy + ", a=" + refCopy.a + ", b=" + refCopy.b.value);
        System.out.println("Shallow Copy: " + shallowCopy + ", a=" + shallowCopy.a + ", b=" + shallowCopy.b.value);
        System.out.println("Deep Copy: " + deepCopy + ", a=" + deepCopy.a + ", b=" + deepCopy.b.value);
//        Original: test.A@1b6d3586, a=10, b=20
//        Ref Copy: test.A@1b6d3586, a=10, b=20
//        Shallow Copy: test.A@4554617c, a=10, b=20    浅拷贝创建新的引用,实际数据的内存地址一样
//        Deep Copy: test.A@74a14482, a=10, b=20
        System.out.println(a.b);
        // 修改原始对象
        a.a = 100;
        a.b.value = 200;

        System.out.println("\nAfter modification:");
        System.out.println("Original: a=" + a.a + ", b=" + a.b.value);
        System.out.println("Ref Copy: a=" + refCopy.a + ", b=" + refCopy.b.value);
        System.out.println("Shallow Copy: a=" + shallowCopy.a + ", b=" + shallowCopy.b.value);
        System.out.println("Deep Copy: a=" + deepCopy.a + ", b=" + deepCopy.b.value);
//        After modification:
//        Original: a=100, b=200
//        Ref Copy: a=100, b=200
//        Shallow Copy: a=10, b=200      浅拷贝的成员对象 是之前的?????
//        Deep Copy: a=10, b=20    创建新对象   新的地址  值不变
        System.out.println(shallowCopy.b);   //test.B@1540e19d
        System.out.println(deepCopy.b);   //test.B@677327b6
        System.out.println(a.b);    //test.B@1540e19d
    }
}

class A implements Cloneable {
    int a;
    B b;

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

    public A deepClone() throws CloneNotSupportedException {
        A copy = (A) super.clone();
        copy.b = this.b.clone(); // 深拷贝:同时克隆B对象
        return copy;
    }
}

class B implements Cloneable {
    int value;
    B(int value) { this.value = value; }

    @Override
    public B clone() throws CloneNotSupportedException {
        return (B) super.clone();
    }
}



Original: test.A@1b6d3586, a=10, b=20
Ref Copy: test.A@1b6d3586, a=10, b=20
Shallow Copy: test.A@4554617c, a=10, b=20
Deep Copy: test.A@74a14482, a=10, b=20
test.B@1540e19d

After modification:
Original: a=100, b=200
Ref Copy: a=100, b=200
Shallow Copy: a=10, b=200
Deep Copy: a=10, b=20
test.B@1540e19d
test.B@677327b6
test.B@1540e19d

其他

  • 成员对象是否被深拷贝,取决于其自身的拷贝实现。

  • 若成员是浅拷贝的,即使外层对象深拷贝,该成员仍可能共享数据。

  • 完全深拷贝需确保所有嵌套成员均支持深拷贝。

浅拷贝(Shallow Copy)

  • 仅复制对象的直接成员值(包括指针的值),不复制指针指向的数据。

  • 成员对象的行为

    • 如果成员是值类型(如 C++ 中的非指针对象、Java 中的基本类型),会直接复制值。

    • 如果成员是引用类型(如指针、Java 中的对象引用),则复制引用,新旧对象共享同一份数据。

    • 深拷贝(Deep Copy)

    • 复制对象的所有直接成员值,并为指针成员分配新内存,拷贝其指向的数据。

    • 成员对象的行为

      • 如果成员是值类型且自身实现了深拷贝(如 C++ 中的拷贝构造函数),则成员会被完全复制。

      • 如果成员是引用类型,需显式实现深拷贝逻辑(如递归调用其 clone() 方法)

deepseek图解内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值