Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在clone()中,我们使用super.clone()然后访问super中没有的变量,这是怎么回事?_Java - Fatal编程技术网

Java 在clone()中,我们使用super.clone()然后访问super中没有的变量,这是怎么回事?

Java 在clone()中,我们使用super.clone()然后访问super中没有的变量,这是怎么回事?,java,Java,在克隆方法的通常实现中有一些我不理解的地方。 如果查看下面代码中try块的第一行,我们将调用super.clone(),它将创建该超类的实例,并返回对该实例的对象引用。现在,该实例不一定包含hireDay,那么我们怎么说copy.hireDay?的确,它可以很好地编译,但是如果实例不包含hireDay,它不应该崩溃吗 public Object clone() { try { Employee copy = (Employee) super.clone(); // cop

在克隆方法的通常实现中有一些我不理解的地方。 如果查看下面代码中try块的第一行,我们将调用super.clone(),它将创建该超类的实例,并返回对该实例的对象引用。现在,该实例不一定包含hireDay,那么我们怎么说copy.hireDay?的确,它可以很好地编译,但是如果实例不包含hireDay,它不应该崩溃吗

public Object clone() {
    try {
        Employee copy = (Employee) super.clone(); // copy ID, name, and salary!
        copy.hireDay = (Date) hireDay.clone();
        return copy;
    } catch (CloneNotSupportedException e) {
        System.out.println(e);
        return null;
    }
}
clone()
是基本
对象
类中的一种特殊方法,它创建正确基类类型的新实例并复制所有字段(并避免使用任何构造函数)。因此,如果没有不委托给
Object.clone()
的自定义父类,则始终会返回当前类型


作为补充说明,在您的示例中,如果
super.clone()
未返回
员工
,然后,您的代码会在您引用
hireDay
之前抛出ClassCastException。克隆的契约是实现与构造函数相同的调用模式:第一步始终是调用超类实现。这导致首先调用
Object.clone
,所有子类都使用该方法返回的实例

Object.clone
将返回与被克隆的类相同的类的实例。这是通过语言外的魔法实现的,基本上是通过内存块的按位拷贝+对拷贝的必要更改


克隆机制是脆弱的,因为祖先链中的任何不遵从类都会破坏其所有后代的克隆。这是该机制不受欢迎的几个原因之一。

您所说的“不委托给Object.clone()”是什么意思?您能给我们举一个祖先链中不兼容类的例子吗(最好与Employee类相关)。另外,还有什么机制比克隆更好呢?任何不返回从
super.clone()
获得的实例的类都是不兼容的。好的,所以我们总是需要调用super.clone()。有比克隆更好的机制吗?是的,还有其他标准习惯用法,如复制构造函数或在内存中序列化反序列化。