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
相关产品推荐
相关产品推荐

