cloneメソッドはオーバーライドされたメソッドを複製しますか?
Aug 25 2020
次のクラスのインスタンスを複製し、インスタンス化するときにメソッドをオーバーライドした場合、クローンにはオーバーライドされたメソッドがありますか?私はこの振る舞いに関して何も見つけていませんhttps://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html また 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();
}
}
回答
6 khelwood Aug 25 2020 at 01:34
あなたが次のようなことをするなら
new ToBeCloned() { @Override...}
これは、サブクラスを作成してインスタンス化するための簡単な方法です。そのインスタンスのクローンを作成すると、すべて同じメソッドを使用して、同じ匿名サブクラスの別のインスタンスを取得します。
3 HopefullyHelpful Aug 25 2020 at 01:18
答えは「はい」です。クローンには、少なくとも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
これは、すでに複製されたインスタンスを複製した場合でも、オーバーライドされたメソッドが保持されていることを証明します。