java - 使用 new 关键字创建对象与使用 clone 方法之间的区别

标签 java

使用 new 关键字创建对象和使用 clone() 创建对象有什么区别? ?内存分配有什么区别吗?

最佳答案

new 根据构造函数创建一个对象,而 clone() 创建一个新对象并使用原始对象的内容初始化字段。

我接受了,您阅读了 javadoc,所以让我带您看一个示例:

public class MyBaby implements Cloneable {

    int age = 0;
    String name = "Dolly";
    List<String> list = new ArrayList<String>();

    public static void main(String[] args) {
        MyBaby originalBaby = new MyBaby();
        originalBaby.setAge(1);
        try {
            // We clone the baby.
            MyBaby clonedBaby = (MyBaby) originalBaby.clone();
            // both babies now have: age 1, name "Molly" and an empty arraylist
            originalBaby.setAge(2);
            // originalBaby has age 2, the clone has age 1
            originalBaby.setName("Molly");
            // same goes for the String, both are individual fields
            originalBaby.getList().add("addedString");
            // both babies get the string added to the list, 
            // because both point to the same list.
            System.out.println(clonedBaby.toString());
        }
        catch (CloneNotSupportedException e) {}
    }
}

javadoc 说:

this method performs a "shallow copy" of this object, not a "deep copy" operation.

这解释了我们婴儿列表的行为:引用被复制,而不是被引用的元素,因此我们的复制是“浅”的

内存分配当然可以不同:

  1. 您可以在构造函数中初始化字段
  2. clone可以初始化一个字段,即一个数组

关于java - 使用 new 关键字创建对象与使用 clone 方法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13206094/

相关文章:

java - java中的线程生产者消费者

java - AWS Lambda 和 S3 - 上传的 pdf 文件为空白

java - nineoldandroids 库使 View 不稳定

java - Android 应用程序无法启动 Activity 组件信息

java - 无法加载库 'gsdll32'

java - 如何在 Cpanel 中设置 Cron Job?

java - args4j : in "usage" how to sort Options manually?

java - 当我尝试解压缩时,ZipOutPutStream、ZipEntry 返回 null

java - 同步块(synchronized block)抛出 DuplicateKeyException

java - Struts 2 验证和输入字段重新填充