当前位置: 首页 > 面试题库 >

为什么Object类的clone()方法提供对象的深层副本?

璩和璧
2023-03-14
问题内容

根据JAVA文档,当调用super.clone()时,将返回对象的浅表副本。在下面的代码中,我有两个对象 nameid
;和一个基本变量 num
。当在第一个对象上调用super.clone()方法时,除了预期的num副本外,它似乎还在创建对象的深层副本(名称和ID)。克隆对象obj之后,我更改了它的名称和id字段。如果正在制作浅表副本,则这些更改应反映在克隆的对象中。我对吗?

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();


 }
}

我在运行代码时得到以下输出:

Annu_modified

204

4

安努

203

3


问题答案:

让我们看一下示例中的一部分:obj.id = new Integer(4);。在这里,您无需更改id的内部表示,而是将新实例分配给id引用。这两个IntegerString是不可变的,所以很难感受到浅VS与他们深拷贝的差异。尝试添加例如ArrayList属性,并且为了对其进行修改,您可以例如添加新元素obj.myList.add(13);



 类似资料:
  • 问题内容: 我想使用构造函数制作对象数组的深层副本。 但是,由于某种原因,我上面的内容不起作用。我有运行的自动化测试,但未通过这些测试。所以这里有一个错误,我不确定是什么。 问题答案: 您已实现的是 浅表 副本。要实现 深度 复制,您必须进行更改 一些事情,分配一个 副本 的到。您如何执行此操作取决于班级。可能的替代方法是: 复制构造函数: 工厂方法: 克隆: 笔记: 上面假设复制构造函数,工厂方

  • 问题内容: clone JavaScript对象的最有效方法是什么?我见过使用它,但这是非标准的,仅受Firefox支持。 我做了类似的事情,但对效率提出了质疑。 我还看到了具有各种缺陷的递归复制功能。 我很惊讶没有规范的解决方案存在。 问题答案: 如果不使用S,功能,,,正则表达式,Maps, Sets, Blobs,的文件列表,ImageDatas,稀疏数组,类型化数组或其他复杂类型的对象中,

  • 问题内容: 实现深层对象复制功能有点困难。您采取什么步骤来确保原始对象和克隆对象没有引用? 问题答案: 一种安全的方法是序列化对象,然后反序列化。这样可以确保所有内容都是全新的参考。 这是有关如何有效执行此操作的文章。 注意事项:类可能会覆盖序列化,这样就不会创建新实例,例如单例。如果您的课程不是可序列化的,那么这当然也行不通。

  • 问题内容: 在Python官方文档说,使用切片运算符和Python中的分配,使切片列表的浅表副本。 但是,例如,当我编写代码时: 当我写: 我得到不同的ID,并且追加一个列表不会反映在另一列表中。它不是在创建深拷贝,还是在我出问题的地方? 问题答案: 您正在创建 浅表 副本,因为嵌套值不会被复制,而只是被引用。一个 深 拷贝会建立一个列表中引用过的值的副本。 演示: 此处 嵌套的 字典不被复制;这

  • 问题内容: 查看Guava的ImmutableList(和其他一些类),您会发现很多重载的便捷方法(“按顺序返回包含给定元素的不可变列表”。)这些方法使用不同数量的参数: 一直到这一步: 我的一些同事认为这很愚蠢,想知道为什么不只有一种方法:。他们怀疑这是不正确的性能“优化”,属于“您认为自己比编译器更聪明”之类的东西。 我的直觉是Kevin Bourrillion等。出于真正的原因将这些方法放在

  • 我试图理解object.clone()在Java中是如何工作的。我偶然发现了以下事实: null 疑点: 为什么Java设计者会做出这样的设计选择并这样实现它?为什么不在本身中定义,如果实现类不为提供实现,那么将产生编译时错误。 Q2.为什么要在运行时检查实例是否实现? 附:我知道在一个问题中问多个问题是一个坏主意。但这些都是密切相关的问题。我可以问一个问题,比如“为什么不包含?”但是,我觉得,为