Клонирует ли метод клонирования переопределенные методы?

Если я клонирую экземпляр следующего класса и переопределяю метод при создании экземпляра, будет ли у клона переопределенный метод? Я не нашел ничего относительно такого поведения в 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();
    }
}

person HopefullyHelpful    schedule 24.08.2020    source источник
comment
new ToBeCloned() { @Override...} - это лишь краткий способ создания подкласса. Если вы его клонируете, вы получите еще один экземпляр того же подкласса со всеми теми же методами.   -  person khelwood    schedule 24.08.2020


Ответы (2)


Если вы сделаете что-то вроде

new ToBeCloned() { @Override...}

это всего лишь краткий способ создания подкласса и его экземпляра. Если вы клонируете этот экземпляр, вы получите еще один экземпляр того же анонимного подкласса со всеми теми же методами.

person khelwood    schedule 24.08.2020

Ответ - да, клон будет содержать переопределенные методы, по крайней мере, в 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

Это доказывает, что переопределенный метод сохраняется, даже если клонируются уже клонированные экземпляры.

person HopefullyHelpful    schedule 24.08.2020