克隆整数

时间:2011-04-28 06:55:43

标签: java cloneable

我正在尝试克隆Integer类的对象,它实现了可克隆的接口。

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

我知道有解决方法,但我必须像这样实现它。 为什么我得到这个错误= clone()已在java.lang.Object

中保护了访问权限

为什么会这样说? clone方法不是clonable接口的公共抽象方法,它与object有什么关系。在此先感谢: - )

7 个答案:

答案 0 :(得分:14)

java.lang.Integer是不可变的。没有理由克隆一个。如果您尝试浪费内存,请尝试Integer.valueOf(myInteger.intValue())

答案 1 :(得分:9)

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

  

protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。

你可以在大多数其他情况下调用clone()的原因是子类通过用public访问修饰符覆盖它来“打开它”。

答案 2 :(得分:2)

出现错误是因为java.lang.Object的clone方法无法公开显示。

答案 3 :(得分:2)

正如Amit和aioobe指出的那样,Integer是不可变的,所以不需要克隆它。

但要回答你的问题。 clone()方法不是clonable接口的一部分,请参阅:http://download.oracle.com/javase/6/docs/api/java/lang/Cloneable.html aioobe告诉你。

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

简而言之,其原因在于,为了克隆一个对象,可能需要也可能没有必要进行“深度克隆”,例如。克隆字段及其子元素。或者克隆一个对象可能没有意义,就像整数一样(因为它是不可变的)

答案 4 :(得分:1)

首先,当您不希望其他人更改您的副本时,我需要通过克隆获取副本。 Now Integer是一个像String和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.

答案 5 :(得分:0)

可能很难相信但是你的错误是对的:clone()在java.lang.Object中具有受保护的访问权限

答案 6 :(得分:0)

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

但是在(默认/本机)clone()方法中你有一个if(){},如果你的类没有实现Cloneable,它将抛出一个Exception CloneNotSupportedException。 我说本机因为,clone()方法是原生的,当你调用它时,在后面是 在C ++中称为另一种方法。

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

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

感谢Is it possible to find the source for a Java native method?

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

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被评估为真

如果没有实施Cloneable,您将获得

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

因为Integer没有实现Cloneable,所以clone()方法将抛出java.lang.CloneNotSupportedException。