Java 浅复制与深复制

在 Java 中,浅复制和深复制在引用地址和参数传递方面有明确区别:

1. 引用地址变化

总结:无论是浅复制还是深复制,原对象和复制出的新对象的引用地址都是不同的。唯一的区别在于内部引用类型字段是否共享地址。

2. 参数传递

Java 中参数传递始终是值传递

    • 浅复制:被复制对象的基本数据类型字段会被复制一份新值,但引用类型字段会直接复制原对象的引用地址(即指向同一个对象)。因此,原对象和复制对象的引用地址不同,但它们内部的引用类型字段共享相同的地址。
    • 深复制:不仅复制基本数据类型字段,还会对引用类型字段创建全新的对象(递归复制)。因此,原对象和复制对象的引用地址不同,且它们内部的引用类型字段也指向不同的地址。

    示例

    public class CopyExample {
        static class Person {
            String name;
            Person(String name) { this.name = name; }
        }
    
        // 尝试修改引用指向
        static void changeReference(Person p) {
            p = new Person("新名字"); // 仅修改方法内的副本引用
        }
    
        // 修改对象内部字段
        static void changeField(Person p) {
            p.name = "修改后的名字"; // 影响原对象(共享引用)
        }
    
        public static void main(String[] args) {
            Person p = new Person("原名字");
            
            changeReference(p);
            System.out.println(p.name); // 输出:原名字(引用未变)
            
            changeField(p);
            System.out.println(p.name); // 输出:修改后的名字(字段被改)
        }
    }

    关键结论

      • 传递基本类型时,传递的是值的副本,修改参数不会影响原变量。
      • 传递引用类型时,传递的是引用地址的副本(即指向同一个对象)。因此:
        • 若在方法中修改对象的字段,原对象会受影响(因为指向同一对象)。
        • 若在方法中让引用指向新对象,原引用不会受影响(因为传递的是地址副本)。
      • 浅复制和深复制都会产生新对象(引用地址不同),区别在于内部引用类型是否共享。
      • Java 参数传递是值传递,引用类型传递的是地址副本,因此可能通过参数修改对象内容,但无法直接修改原引用的指向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值