Klont die Klonmethode überschriebene Methoden?

Aug 25 2020

Wenn ich eine Instanz der folgenden Klasse klone und beim Instanziieren eine Methode überschreibe, hat der Klon dann die überschriebene Methode? Ich habe nichts zu diesem Verhalten in gefundenhttps://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html Noch 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();
    }
}

Antworten

6 khelwood Aug 25 2020 at 01:34

Wenn du so etwas machst

new ToBeCloned() { @Override...}

Es ist nur eine kurze Möglichkeit, eine Unterklasse zu erstellen und zu instanziieren. Wenn Sie diese Instanz klonen, erhalten Sie eine andere Instanz derselben anonymen Unterklasse mit denselben Methoden.

3 HopefullyHelpful Aug 25 2020 at 01:18

Die Antwort lautet ja, der Klon enthält die überschriebenen Methoden mindestens in javaSE-1.8.

Dies wird durch das folgende Programm und seine Ausgabe veranschaulicht:

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

Die Ausgabe des Programms ist die folgende:

returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():2
ToBeCloned Overridden

Dies beweist, dass die überschriebene Methode beibehalten wird, auch wenn bereits geklonte Instanzen geklont wurden.