该代码已在我今天的计算机科学 class 中介绍(伴随着与该帖子无关的几个问题)。这是而不是作业,只是我个人在代码中发现的一些问题;

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 ) {

为什么需要这个?这是在Element不扩展Cloneable的情况下吗?

最佳答案

super.clone()如何知道要返回CloneClass实例?

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

怎么可能这样直接引用copy.element;被宣布为私人!

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

为什么需要这个?这是否是Element不扩展Cloneable的情况?

因为CloneClass可能不会扩展Cloneable(它显然可以扩展),但是由于此API是使用Object#clone抛出CloneNotSupportedException的方式设计的,因此编译器无法建立此连接。

这在Java中有点丑陋的设计缺陷。对象具有clone方法,但对象本身不可克隆(这是标记接口)。因此,您可以在不支持该方法的对象上调用该方法。与Serializable类似。

10-06 06:43