Does the clone method clone overridden methods?

Viewed 56

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();
    }
}
2 Answers

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.

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.

Related