3

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

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

为什么需要这个?这是incaseElement不延长Cloneable吗?

4

4 回答 4

6

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

即使在一个super方法内,this仍然指向同一个对象,所以this.getClass()会给你CloneClass(甚至是一个子类)。

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

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

为什么需要这个?这是 incase Element 不扩展 Cloneable 吗?

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

这在 Java 中有点丑陋的设计缺陷。Object 有一个clone方法,但是 Object 本身不是 Cloneable (这是一个标记接口)。因此,您可以在不支持它的对象上调用该方法。与可序列化类似的事情。

于 2013-04-15T04:32:14.913 回答
0

1) Object.clone API 声明对于任何对象 x,x.clone().getClass() == x.getClass() 为真

2)可以访问私有的copy.element,因为我们在同一个类中访问它

3)如果Element没有实现Cloneable,element.clone()会抛出CloneNotSupportedException,会被捕获并返回null

于 2013-04-15T04:40:09.453 回答
0

Object#clone签名是

受保护的对象 clone() 抛出 CloneNotSupportedException

Object它复制包含被克隆对象的内部“深层结构”的任何可变对象并返回CloneClass.

copy.element = element.clone();

您可以引用私有字段,因为您自己在同一个班级。

} 捕捉(CloneNotSupportedException e){

Object#cloneCloneNotSupportedException如果对象的类不支持 Cloneable 接口,则抛出。覆盖 clone 方法的子类也可以抛出此异常,表示无法克隆实例。

于 2013-04-15T04:32:48.633 回答
0
// I don't understand this
CloneClass copy = ( CloneClass ) super.clone ();

构造此对象的副本,按位复制其所有成员,包括原始类型和引用类型。

// or this
copy.element = element.clone ();

看上面。在此行之前,copy.element指向与 相同的对象this.element。这一行克隆了它,所以它们现在指向不同的元素,所以克隆this现在完全独立于this.

于 2013-04-15T04:58:05.410 回答