Menu
Coddy logo textTech

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 Ihre 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 können Sie unabhängige Kopien von Objekten erstellen:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy ist ein separates Objekt mit denselben Werten

Standardmäßig führt clone() eine flache Kopie (shallow copy) aus, was bedeutet, dass primitive Werte und Referenzen kopiert werden. Wenn Ihr Objekt andere Objekte als Felder enthält, referenzieren sowohl das Original als auch der Klon dieselben verschachtelten Objekte. Für wirklich unabhängige Kopien mit verschachtelten Objekten müssen Sie eine tiefe Kopie (deep copy) implementieren, indem Sie auch diese verschachtelten Objekte innerhalb Ihrer clone()-Methode klonen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Dokumentenmanagementsystem erstellen, das das Klonen von Objekten demonstriert. Sie werden eine Document-Klasse erstellen, die geklont werden kann, um unabhängige Kopien zu erstellen, sodass Benutzer Dokumente duplizieren können, während das Original intakt bleibt.

Sie werden Ihren Code in zwei Dateien organisieren:

  • Document.java: Erstellen Sie eine Klasse, die ein Dokument repräsentiert und das Klonen unterstützt. Ein Document hat drei private Felder: title (String), author (String) und version (int). Fügen Sie einen Konstruktor zur Initialisierung aller Felder und Getter-Methoden für jedes Feld hinzu. Fügen Sie außerdem eine setVersion(int version)-Methode hinzu, um die Versionsnummer zu aktualisieren.

    Lassen Sie Ihre Document-Klasse das Cloneable-Interface implementieren und überschreiben Sie die clone()-Methode, um ein Document zurückzugeben. Behandeln Sie die CloneNotSupportedException innerhalb der Methode, indem Sie sie in eine RuntimeException einschließen.

    Überschreiben Sie toString(), um Folgendes zurückzugeben: Document[title=X, author=Y, version=Z], wobei X, Y und Z die tatsächlichen Feldwerte sind.

  • Main.java: Erwecken Sie Ihre Document-Klasse zum Leben, indem Sie ein Dokument erstellen und es klonen. Sie erhalten drei Eingaben: einen Titel (String), einen Autor (String) und eine Versionsnummer (int).

    Erstellen Sie ein Original-Document mit diesen Werten und klonen Sie es dann, um eine Kopie zu erstellen. Ändern Sie nach dem Klonen die Version der Kopie, indem Sie sie mit setVersion() um 1 erhöhen. Dies zeigt, dass der Klon wirklich unabhängig vom Original ist.

    Geben Sie drei Zeilen aus:

    1. Original: gefolgt von der toString()-Ausgabe des Originaldokuments
    2. Clone: gefolgt von der toString()-Ausgabe des geklonten Dokuments
    3. Independent: gefolgt von true oder false, was angibt, ob das Original und der Klon unterschiedliche Objekte sind (verwenden Sie den !=-Vergleich)

Sie erhalten drei Eingaben: den Dokumenttitel (String), den Namen des Autors (String) und die Versionsnummer (int).

Beachten Sie, wie das Originaldokument nach der Änderung der Version des Klons unverändert bleibt – dies beweist, dass clone() eine wirklich unabhängige Kopie erstellt hat!

Spickzettel

Die Methode clone() erstellt eine Kopie eines Objekts. Um sie zu verwenden, muss Ihre 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);
        }
    }
}

Erstellen von unabhängigen Kopien:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy ist ein separates Objekt mit denselben Werten

Standardmäßig führt clone() eine flache Kopie aus, wobei primitive Werte und Referenzen kopiert werden. Wenn Ihr 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 implementieren Sie eine tiefe Kopie, indem Sie auch diese verschachtelten Objekte innerhalb Ihrer clone()-Methode klonen.

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: Erstellen Sie ein Original-Dokument mit den Eingabewerten
        
        // TODO: Klonen Sie das Original-Dokument, um eine Kopie zu erstellen
        
        // TODO: Ändern Sie die Version des Klons, indem Sie sie um 1 erhöhen
        
        // TODO: Geben Sie "Original: " gefolgt vom Original-Dokument aus
        
        // TODO: Geben Sie "Clone: " gefolgt vom geklonten Dokument aus
        
        // TODO: Geben Sie "Independent: " gefolgt von true/false aus (prüfen Sie, ob Original != Klon)
        
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung