我正在尝试克隆Integer类的对象,它实现了可克隆的接口。
Integer a = new Integer(4);
Integer b = a.clone();
我知道有解决方法,但我必须像这样实现它。
为什么我得到这个错误=
clone()
已在java.lang.Object
为什么会这样说? clone方法不是clonable接口的公共抽象方法,它与object有什么关系。在此先感谢: - )
答案 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。