clone()-Methode
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 43 von 87.
Die Methode clone() erstellt eine Kopie eines Objekts. Um sie zu verwenden, muss deine Klasse das Interface Cloneable implementieren und die Methode clone() aus der Klasse Object überschreiben.
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}Jetzt kannst du unabhängige Kopien von Objekten erstellen:
Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy ist ein separates Objekt mit denselben WertenStandardmäßig führt clone() eine flache Kopie durch, das heißt, es kopiert primitive Werte und Referenzen. Wenn dein Objekt andere Objekte als Felder enthält, verweisen sowohl das Original als auch der Klon auf dieselben verschachtelten Objekte. Für wirklich unabhängige Kopien mit verschachtelten Objekten musst du eine tiefe Kopie implementieren, indem du diese verschachtelten Objekte ebenfalls innerhalb deiner clone()-Methode klonst.
Aufgabe
EinfachErstellen wir ein Dokumentverwaltungssystem, das das Klonen von Objekten demonstriert. Du erstellst eine Document-class, die geklont werden kann, um unabhängige Kopien zu erstellen. So können Benutzer Dokumente duplizieren und dabei das Original unverändert behalten.
Du organisierst deinen Code auf zwei Dateien:
Document.java: Erstelle eine class, die ein Dokument darstellt und das Klonen unterstützt. Ein Document verfügt über drei private Felder:title(String),author(String) undversion(int). Füge einen constructor hinzu, der alle Felder initialisiert, sowie getter methods für jedes Feld. Füge außerdem einesetVersion(int version)-method hinzu, um die Versionsnummer zu aktualisieren.Lass deine Document-class das
Cloneable-interface implementieren und überschreibe dieclone()-method, sodass sie einDocumentzurückgibt. Behandle dieCloneNotSupportedExceptioninnerhalb der method, indem du sie in eineRuntimeExceptioneinschließt.Überschreibe
toString(), sodass Folgendes zurückgegeben wird:Document[title=X, author=Y, version=Z], wobei X, Y und Z die tatsächlichen Feldwerte sind.Main.java: Lass deine Document-class zum Leben erwachen, indem du ein Dokument erstellst und es klonst. Du erhältst drei Eingaben: einen Titel (String), einen author (String) und eine Versionsnummer (int).Erstelle ein Original-Document mit diesen Werten und klone es anschließend, um eine Kopie zu erstellen. Ändere nach dem Klonen die Version der Kopie, indem du sie mithilfe von
setVersion()um 1 erhöhst. Dies zeigt, dass der Klon wirklich unabhängig vom Original ist.Gib drei Zeilen aus:
Original:, gefolgt von der toString()-Darstellung des OriginaldokumentsClone:, gefolgt von der toString()-Darstellung des geklonten DokumentsIndependent:, gefolgt vontrueoderfalse, was angibt, ob das Original und der Klon unterschiedliche Objekte sind (verwende den!=-Vergleich)
Du erhältst drei Eingaben: den Dokumenttitel (String), den Namen des authors (String) und die Versionsnummer (int).
Beachte, dass das Originaldokument nach der Änderung der Version des Klons unverändert bleibt. Dies beweist, dass clone() eine wirklich unabhängige Kopie erstellt hat!
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String title = scanner.nextLine();
String author = scanner.nextLine();
int version = scanner.nextInt();
// TODO: Erstelle ein originales Document mit den Eingabewerten
// TODO: Klone das originale Dokument, um eine Kopie zu erstellen
// TODO: Ändere die version des Klons, indem du sie um 1 erhöhst
// TODO: Gib "Original: " gefolgt vom originalen Dokument aus
// TODO: Gib "Clone: " gefolgt vom geklonten Dokument aus
// TODO: Gib "Independent: " gefolgt von true/false aus (prüfe, ob original != clone)
}
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler