gpt4 book ai didi

java - 为什么 Object 类的 clone() 方法提供对象的深拷贝?

转载 作者:行者123 更新时间:2023-11-30 11:20:10 25 4
gpt4 key购买 nike

根据 JAVA 文档,调用 super.clone() 时会返回对象的浅拷贝。在下面的代码中,我有两个对象 nameid;和一个原始变量 num。当在第一个对象上调用 super.clone() 方法时,它似乎正在创建对象(名称和 ID)的深拷贝,以及预期的只有 num 的副本。克隆对象 obj 后,我更改了它的 name 和 id 字段。如果正在制作浅拷贝,这些更改应该反射(reflect)在克隆的对象中。我说得对吗?

public class Cloning implements Cloneable {
String name;
int num;
Integer id;
Cloning(String name,int num,Integer id)
{
this.name = name;
this.num = num;
this.id = id;
}
public Object clone()
{
try
{
return super.clone();
}
catch(CloneNotSupportedException E)
{
System.out.println(E.getMessage());
return null;
}
}
public void print()
{
System.out.println(name);
System.out.println(num);
System.out.println(id);
}


public static void main(String[] args) {
// TODO Auto-generated method stub
Cloning obj = new Cloning("Annu",203,new Integer(3));
Cloning obj1 = (Cloning)obj.clone();
obj.name = "Annu_modified";
obj.num = 204;
obj.id = new Integer(4);
obj.print();
obj1.print();


}
}

I get the following output on running the code:

年度修改

204

4

203

3

最佳答案

name 和 id 字段是对 String 和 Integer 类型对象的引用。当您进行浅拷贝时,新副本指向名称和 ID 相同的对象。

然后当你这样做

obj.name = "Annu_modified";

您更改 obj.name 以引用 String 类型的新对象,而 obj1.name 继续引用旧对象。如果您可以更改引用的对象 obj.name,那么两者都会更改。但是,对于字符串,您不能因为它是所谓的不可变对象(immutable对象)。

关于java - 为什么 Object 类的 clone() 方法提供对象的深拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22877318/

25 4 0
文章推荐: java - 用于枚举的 wsimport JAXB 类
文章推荐: 在服务器的所有 drupal 网站中注入(inject) Javascript
文章推荐: ios - 如何让 tabBarController 在第二个ViewController加载时自动加载
文章推荐: javascript - 在 JavaScript 和 HTML 中,如何获取当前按钮所在的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com