Java Doc说 -

类对象本身并不能实现接口可克隆,因此在一个对象的对象上调用克隆方法将导致在运行时抛出异常。

这就是为什么对象类中的克隆方法受到保护的原因?是这样吗 ?

这意味着在调用克隆方法时,任何不实现克隆的类都会抛出clonotsupport的异常。

我运行了测试程序

public class Test extends ABC implements Cloneable{

    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("calling super.clone");
            return super.clone();
    }

    public static void main(String[] args) {
        Test t = new Test();
        try{
        t.clone();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ABC{

}

从类测试的克隆方法中super.clone被调用?

为什么不引发异常?

有帮助吗?

解决方案

继承树 Test 实例 t 好像

Object
  ABC
    Test

Test 也实施 Cloneable 这意味着当您调用该方法时 super.clone() Object' clone 方法将被调用。它检查了实例 t 实现 Cloneable 界面。由于它确实实现了该方法不会引发异常。

其他提示

可克隆接口是一个标记接口,表明实现类支持克隆方法。 super.clone()不引发例外的原因是,它被调用的基本对象是可以通过继承来克隆的。

来自Javadoc:

一个类实现可键入的界面,以指示对object.clone()方法,该方法对于该方法进行现场视野副本是合法的。

在不实现可克隆接口的实例上调用对象的克隆方法会导致抛出的异常clonotsupportedException。

看: 可克隆(Java Platform SE 6)

因为您的班级实施 Cloneable. 。来自 JavadocCloneable:

一个类实现可键入的界面,以指示对object.clone()方法,该方法对于该方法进行现场视野副本是合法的。

因此,这允许使用 Object' clone() 方法。它(再次根据Javadoc)只是覆盖的惯例 clone(). 。如果您不覆盖它,并且 Object' clone() 方法执行野外副本,您可能仍然会得到一个 CloneNotSupportedException 如果其中一个字段本身不可锁定。因此,覆盖它是一个很好的建议。

为什么在对象类中的克隆方法 protected?

因此,选择支持克隆的课程不是 强迫 在公共API中公开它。

如您的示例所示,允许一个子类覆盖与该方法的继承版本相比,具有更多访问的方法。您只是无法以这种方式减少方法的访问。

这意味着在调用克隆方法时,任何不实现克隆的类都会抛出clonotsupport的异常。

那是对的。

从类测试的克隆方法中super.clone被调用?

那是对的。

为什么不引发异常?

因为您已经宣布您的班级实施 Cloneable. 。如果您没有这样做, 抛出一个例外...假设您的克隆方法仍在调用 super.clone().

这可能会给您答案,以解决为什么受保护的方法为什么克隆方法受到保护

它不会引发异常,因为您可以实现可克式。从可包隆的文档中:

“一个类实现可包隆的界面,以指示对object.clone()方法,该方法是该方法合法的,使该类实例的现场视野副本。在一个实例上调用对象的克隆方法 不实施 可包隆的界面导致抛出的异常clonotsupportedException。 “

但是,当您实施它时,您告诉对象实现,制作现场副本副本是合法的,以免引发异常。

我会说一个很好的问题来使受访者感到困惑:)。

至于原因不引发异常的原因。以对象方式考虑它。您的t对象是类测试,可实现可克隆。当您调用方法super.clone时,它仍然是类测试的对象,因此没有理由会抛出clonotsupporporported异常。如果它是类对象本身的对象,它将引发例外。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top