英文:
Does the clone method clone overridden methods?
问题
以下是翻译好的部分:
如果我克隆下面类的一个实例,并且在实例化时重写一个方法,那么克隆会有被重写的方法吗?我在以下链接中没有找到有关这种行为的任何信息:
public class ToBeCloned implements Cloneable{
public int returnInt() {
return 1;
}
public void printTest() {
System.out.println("returnInt():" + returnInt() + "\nToBeCloned 原始");
}
@Override
public ToBeCloned clone() throws CloneNotSupportedException {
return (ToBeCloned) super.clone();
}
}
链接1:https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html
链接2:https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()
英文:
If I clone an instance of the following class, and overridde a method when instancing, will the clone have the overridden method? I haven't found anything regarding this behavior in
https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html nor https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()
.
public class ToBeCloned implements Cloneable{
public int returnInt() {
return 1;
}
public void printTest() {
System.out.println("returnInt():"+returnInt()+"\nToBeCloned Original");
}
@Override
public ToBeCloned clone() throws CloneNotSupportedException {
return (ToBeCloned) super.clone();
}
}
答案1
得分: 6
如果你做类似这样的事情:
new ToBeCloned() { @Override...}
这只是一种创建子类并实例化的简便方式。如果你克隆那个实例,你会得到另一个相同匿名子类的实例,拥有所有相同的方法。
英文:
If you do something like
new ToBeCloned() { @Override...}
it is just a short way of creating a subclass and instantiating it. If you clone that instance, you get another instance of the same anonymous subclass, with all the same methods.
答案2
得分: 3
答案是肯定的,克隆体中将包含在JavaSE 1.8中至少被覆盖的方法。
这通过以下程序和其输出进行了说明:
public class OverridingMethods {
public static void main(final String[] args) {
final ToBeCloned toBeCloned1 = new ToBeCloned();
final ToBeCloned toBeCloned2 = new ToBeCloned() {
@Override
public int returnInt() {
return 2;
}
@Override
public void printTest() {
System.out.println("returnInt():" + returnInt() + "\nToBeCloned Overridden");
}
};
ToBeCloned toBeCloned3 = null;
ToBeCloned toBeCloned4 = null;
ToBeCloned toBeCloned5 = null;
try {
toBeCloned3 = toBeCloned1.clone();
toBeCloned4 = toBeCloned2.clone();
toBeCloned5 = toBeCloned4.clone();
} catch (final CloneNotSupportedException e) {
e.printStackTrace();
}
toBeCloned1.printTest();
toBeCloned2.printTest();
toBeCloned3.printTest();
toBeCloned4.printTest();
toBeCloned5.printTest();
}
}
程序的输出如下:
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():2
ToBeCloned Overridden
这证明了覆盖的方法会被保留,即使是在已经克隆的实例中进行克隆。
英文:
The answer is yes, the clone will contain the overridden methods atleast in javaSE-1.8.
This is illustrated by the following programm and it's output:
public class OverridingMethods {
public static void main(final String[] args) {
final ToBeCloned toBeCloned1 = new ToBeCloned();
final ToBeCloned toBeCloned2 = new ToBeCloned() {
@Override
public int returnInt() {
return 2;
}
@Override
public void printTest() {
System.out.println("returnInt():"+returnInt()+"\nToBeCloned Overridden");
}
};
ToBeCloned toBeCloned3 = null;
ToBeCloned toBeCloned4 = null;
ToBeCloned toBeCloned5 = null;
try {
toBeCloned3 = toBeCloned1.clone();
toBeCloned4 = toBeCloned2.clone();
toBeCloned5 = toBeCloned4.clone();
} catch (final CloneNotSupportedException e) {
e.printStackTrace();
}
toBeCloned1.printTest();
toBeCloned2.printTest();
toBeCloned3.printTest();
toBeCloned4.printTest();
toBeCloned5.printTest();
}
}
The output of the programm is the following:
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():2
ToBeCloned Overridden
This proofs that the overridden method is kept, even if cloning already cloned instances.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论