我正在尝试克隆一个类整数的对象,该对象确实实现了可克隆的插头。

Integer a = new Integer(4);  
Integer b = a.clone();

我知道为此有所处理,但我必须这样实施。为什么我会得到这个错误=clone() 已经保护了访问 java.lang.Object

为什么要这么说?克隆方法不是一种公共的可克隆接口的抽象方法,它与对象有什么关系。提前致谢 :-)

有帮助吗?

解决方案

当然,所有方法中的所有方法 Object 继承。这 clone 但是方法是 protected, ,因此只能从子类内部访问。

受保护的修饰符指定该成员只能在其自己的软件包中访问(如包装私有关系),此外,通过其类别的另一个软件包中的子类访问。

您可以致电的原因 clone() 在大多数其他情况下,子类通过与 public 访问修饰符。

其他提示

java.lang.IntegerS是不变的。没有理由克隆一个。如果你是 要浪费记忆,请尝试 Integer.valueOf(myInteger.intValue()).

错误是因为 clone Java.lang.Object的方法不公开可见。

正如阿米特(Amit)和艾奥伯(Aioobe)指出的那样,整数是不可变的,因此无需克隆它。

但是要回答你的问题。 clone()方法不是可克隆接口的一部分,请参见: http://download.oracle.com/javase/6/docs/api/java/lang/lang/clonable.html 正如Aioobe告诉您的那样。

克隆方法在对象中被声明为保护,您必须用公共方法覆盖它才能使用它。看 http://download.oracle.com/javase/6/docs/api/java/lang/lang/object.html#clone()

简而言之,这样做的原因是,为了克隆一个对象,可能需要或不需要做“深键”。克隆字段及其子元素。否则克隆物体可能没有意义,因为情况与整数相关(因为它是不可变的)

首先,当您不希望别人更改副本时,我需要通过克隆获得副本。现在,整数是一个包装班,例如字符串和double 不变。这意味着您无法更改它的内部。因此,只要您有原始参考,您的对象就完好无损。

Integer a = new Integer(4); // a referencing to this newly Created Integer
    b = a;  // b is referencing to..
    b = new Integer(8) // b no longer references to 4. 
                      //We changed the reference not the internals of it which is impossible.

可能很难相信,但是您的错误是正确的:clone()在java.lang.object中有保护访问权限

是的,因为clone()方法是 受保护 它只能继承,但是您不能在另一类的对象上称其为。每个类都继承对象,因此您只需调用clone()。

但是在(默认/本机)clone()方法中,您有一个if(){},在其中,如果您的类不实现可克隆,它将抛出异常clonotsupportedException。我说本机是因为,clone()方法是本机的,当您称其为后背时,被称为C ++中写入的另一种方法。

这是当您调用clone()时称为代码的一小部分。

if (!klass->is_cloneable()) {
    ResourceMark rm(THREAD);
    THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
  }

谢谢 是否可以找到Java本机方法的来源?

您可以使用反射来调用克隆方法,而无需在对象中覆盖它。

public class Main{
    public static void main(String[] args) throws CloneNotSupportedException {
        A a = new A();
        Object o = new Object();
        Method method = null;
        try {
            method = o.getClass().getDeclaredMethod("clone");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        method.setAccessible(true);
        try {
            System.out.println(method.invoke(a));
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

class A implements Cloneable {
}

method.invoke(a) instanceof A 被评估为真实

如果不实施可克隆,您将获得

Caused by: java.lang.CloneNotSupportedException: defaultPackage.A
    at java.lang.Object.clone(Native Method)

而且,由于整数无法实现可键入,因此clone()方法将抛出java.lang.clonotsupportedexception。

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