Java – 理解克隆

这段代码今天在我的计算机科学课上提出(伴随着与这篇文章无关的几个问题).这不是家庭作业,只是我个人在代码中发现的一些问题;

public class CloneClass implements Cloneable {
    private Element element ;

    public CloneClass ( Element newElement ) {
        element = newElement ;
    }

    public CloneClass clone () {
        try {
            // I don't understand this
            CloneClass copy = ( CloneClass ) super.clone ();
            // or this
            copy.element = element.clone ();

            return copy ;
        } catch ( CloneNotSupportedException e ) {
            return null ;
        }
    }
}

首先;

CloneClass copy = ( CloneClass ) super.clone ();

我们知道super是Object(因为没有显式扩展)并且super.clone()必须返回一个CloneClass实例(它不能返回一个Object实例,因为它是抽象的,并且它被向下转换为CloneClass,所以它必须是CloneClass或后代实例).
我的问题; super.clone()如何知道返回CloneClass实例?

其次;

copy.element = element.clone ();

怎么可能像这样直接引用copy.element;它被宣布为私人!
它不是当前类的属性,它是另一个实例的属性(恰好是同一个类)

第三;

} catch ( CloneNotSupportedException e ) {

为什么需要这个?这个incase元素不会扩展Cloneable吗?

最佳答案

how does super.clone() know to return a CloneClass instance?

即使在超级方法中,这仍然指向同一个对象,因此this.getClass()将为您提供CloneClass(甚至是子类).

How is it possible to directly refer to copy.element like that; it’s declared as private!

您不仅可以访问私有字段,还可以访问同一类的其他实例.它只对其他类私有.

Why is this needed? Is this incase Element doesn’t extend Cloneable?

因为CloneClass可能不会扩展Cloneable(它显然会这样做,但是由于这个API是如何使用Object#clone throw CloneNotSupportedException设计的,编译器无法建立此连接).

这在Java中是一个丑陋的设计疣. Object有一个clone方法,但Object本身不是Cloneable(它是一个标记接口).因此,您可以在不支持它的对象上调用该方法.类似的东西与Serializable.

转载注明原文:Java – 理解克隆 - 代码日志