题
我正在尝试克隆一个类整数的对象,该对象确实实现了可克隆的插头。
Integer a = new Integer(4);
Integer b = a.clone();
我知道为此有所处理,但我必须这样实施。为什么我会得到这个错误=clone()
已经保护了访问 java.lang.Object
为什么要这么说?克隆方法不是一种公共的可克隆接口的抽象方法,它与对象有什么关系。提前致谢 :-)
解决方案
当然,所有方法中的所有方法 Object
继承。这 clone
但是方法是 protected
, ,因此只能从子类内部访问。
受保护的修饰符指定该成员只能在其自己的软件包中访问(如包装私有关系),此外,通过其类别的另一个软件包中的子类访问。
您可以致电的原因 clone()
在大多数其他情况下,子类通过与 public
访问修饰符。
其他提示
java.lang.Integer
S是不变的。没有理由克隆一个。如果你是 试 要浪费记忆,请尝试 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());
}
您可以使用反射来调用克隆方法,而无需在对象中覆盖它。
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。