Klont die Klonmethode überschriebene Methoden?
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
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.
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.