繁体   English   中英

在clone()中我们使用super.clone()然后访问一个不在super中的变量,怎么来的?

[英]In clone() we use super.clone() then access a variable that is not in super, how comes?

在克隆方法的通常实现中,有一些我不理解的东西。 如果你看下面代码中try块的第一行,我们调用super.clone(),它将创建超类的实例,并返回对该实例的Object引用。 现在,那个实例不一定包含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中的一种特殊方法,它创建正确基类类型的新实例并复制所有字段(并避免使用任何构造函数)。 因此,如果您没有委托给Object.clone()的自定义父类,您将始终返回当前类型。

作为一个方面说明,在你的榜样,如果super.clone() 没有返回的Employee ,那么你的代码会抛出ClassCastException异常之前,你甚至得在那里你参考步骤hireDay

clone的契约是实现与构造函数相同的调用模式:第一步始终是调用超类实现。 这会导致首先调用Object.clone ,并且所有子类都使用该方法返回的实例。

Object.clone将返回与正在克隆的类相同的类的实例。 这通过extralinguistic魔术发生,基本上是通过内存块的按位副本+对副本的必要更改。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM