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

これは、すでに複製されたインスタンスを複製した場合でも、オーバーライドされたメソッドが保持されていることを証明します。