You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中对象直接赋值obj1=obj2与clone()克隆的区别是什么?

Java中=对象赋值和clone()方法的核心差异

默认你提供的测试代码中已经正确让Dummy_3类实现了Cloneable接口并重写了clone()方法,否则直接调用clone()会抛出编译错误或运行时异常。两者的底层逻辑完全不同,你测试时输出结果一致是因为测试用例没有覆盖到属性修改的场景:

  • 引用赋值(=):仅复制对象的内存地址,不会创建新的对象实例。赋值完成后两个变量指向堆内存中的同一个对象,任意一个变量修改对象属性,另一个变量读取属性时都会同步得到修改后的结果。
  • clone()克隆:会在堆内存中开辟全新的存储空间,创建一个和原对象属性值完全一致的独立新对象,克隆完成后两个变量指向不同的对象实例,修改其中任意一个对象的属性都不会影响另一个。

差异演示代码

可测试的完整Dummy_3类实现

public class Dummy_3 implements Cloneable {
    String title;

    public Dummy_3(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

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

=赋值的效果验证

public static void main(String[] args) {
    Dummy_3 obj1 = new Dummy_3("Avengers: Infinity War");
    Dummy_3 obj2 = new Dummy_3("Avengers: Endgame");
    // 引用赋值,obj1和obj2指向同一个对象
    obj1 = obj2;
    // 仅修改obj2的属性
    obj2.setTitle("Avengers: Secret Wars");
    System.out.println(obj1.getTitle()); // 输出:Avengers: Secret Wars,跟随obj2的修改同步变化
    System.out.println(obj2.getTitle()); // 输出:Avengers: Secret Wars
}

clone()克隆的效果验证

public static void main(String[] args) throws CloneNotSupportedException {
    Dummy_3 obj1 = new Dummy_3("Batman Begins");
    Dummy_3 obj2 = new Dummy_3("Batman: The Dark Knight");
    // 克隆对象,obj2指向和obj1完全独立的新对象
    obj2 = obj1.clone();
    // 仅修改obj1的属性
    obj1.setTitle("Batman: The Dark Knight Rises");
    System.out.println(obj1.getTitle()); // 输出:Batman: The Dark Knight Rises,自身修改生效
    System.out.println(obj2.getTitle()); // 输出:Batman Begins,不受obj1修改的影响
}

内容的提问来源于stack exchange,提问作者Surendra Anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:27:02