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

了解Java中的Object.clone()

何涵忍
2023-03-14
问题内容

我知道使用这种克隆机制并不是一个好主意(因为它被某些作者建议“破了”),尽管我需要帮助来理解它的工作原理。我们得到以下类层次结构:

class N implements Cloneable{
    protected int num;
    public N clone() throws CloneNotSupportedException{
        return (N)super.clone();
    }
}

class M extends N{
    protected String str;
    public M clone() throws CloneNotSupportedException{
        M obj = (M)super.clone();
        obj.setString(new String(this.str));
        return obj;
    }
    void setString(String str){
        this.str = str;
    }
}

既然N扩展了Object,如何super.clone()返回一个实例Nsuper.clone()实际上Object.clone()是返回对class对象的引用Object。为什么我们可以将其投射到NNnum不在班上的成员Object。默认行为实际上是如何设法自动克隆此变量的(因为该变量在class中没有记录Object)?

同样,M也是如此。在M.clone()我们中,将一个对象从class
N(由返回super.clone())转换为class的对象M。我知道所有这些都是有效的,但我不明白为什么。


问题答案:

Object#clone是一个本机方法,它为您的对象创建一个低级二进制副本,从而生成同一类的另一个实例。因此,向下转换是安全的。

请注意,这是拥有多态克隆方法的 唯一 方法。



 类似资料:
  • 问题内容: 我试图通过一些在线材料来学习Java中的注释。 在下面的代码,发生了什么事我亲爱的“Hello World”的字符串,我在这行通过:? 上面是定义的注释,下面是其用法 当我运行此代码时,它只是打印 请帮帮我,我完全不了解注释。 问题答案: 注释基本上是可以附加到字段,方法,类等的数据位。 在Java中声明注释的语法有点尴尬。它们看起来有点像接口(毕竟是用声明的),但它们并不是真正的接口

  • 问题内容: 我试图了解类泛型的工作原理,这对我来说毫无意义。 因此,例如,如果我有以下课程: 然后我尝试 go方法不应该接受A或A的任何子类吗? 谢谢 :) 问题答案: 这样做的原因是基于Java如何实现泛型的。 数组示例 使用数组可以做到这一点(数组是协变的,正如其他人解释的那样) 但是,如果您尝试这样做会发生什么? 最后一行可以正常编译,但是如果您运行此代码,则可能会得到一个。因为您正在尝试将

  • 问题内容: 我有一个通用类,说: 在此类的方法内部,我想测试T的类型,例如: 我怎样才能做到这一点 ? 谢谢你的帮助 问题答案: 通常,由于类型擦除,您不能这样做。有关更多详细信息,请参见Angelika Langer的Java泛型常见问题解答 。 您 可以 做的是将a传递给构造函数,然后检查: 请注意,尽管如此,Java仍不允许将原语用于类型参数,因此实在不行。

  • 问题内容: 假设我有两个类,A和B。A类定义为抽象类,而B扩展了这个抽象类,最后我测试了结果,两个类都属于同一包。 现在,当我测试它们时: 我得到预期的输出: 问题: 关键字的目的是什么,因为如果我省略它,它仍然可以正常工作。 如果我没有实现抽象方法,则会出现编译错误。那么与实现接口有什么区别? 另外,我也可以在B中实现。然后输出更改为B中的用法。这是否还会覆盖父类方法?那么在A类中将方法显式定义

  • 问题内容: 为了确定Java堆大小,我使用了以下命令: 但是,我无法理解ErgoHeapSizeLimit,HeapSizePerGCThread,InitialHeapSize,LargePageHeapSizeThreshold,MaxHeapSize等的含义。有人可以简要解释一下这些术语。其实我是Java的新手 其实我需要确定我的机器可以分配给进程的堆大小吗?因为我的应用程序之一需要以下参数

  • 问题内容: 我不确定以下代码中的最后一条语句为何非法。应该是的子类型,那么为什么不能将其分配给? 问题答案: 关键是指向 某种 类型的列表,但是编译器不知道该类型是什么,因此它不 知道 向其添加类型是否有效。举个例子,这也是一件好事- 您将向最初创建的用于保存字符串列表的对象添加一个。当然,这些信息在Java执行时会丢失-但是编译器会尽力确保您的安全。 见Java泛型常见问题解答了 很多 的更多信