Wie lässt sich ein Objekt klonen?

Um ein Objekt klonen zu können, muss die Klasse die java.lang.Object-Methode clone() überschreiben.

Beim Klonen eines Objektes wird dies mit allen seinen Elementen identisch kopiert und an einem gesonderten Speicherplatz abgelegt. Um dies zu erreichen, muss sichergestellt werden, dass der momentane Zustand des zu klonenden Objektes exakt erfasst wird. Er besteht hauptsächlich aus den Werten, die in den Klassen- und Instanzvariablen des Objektes gespeichert sind.
Die vollständige Erfassung dieser Werte muss durch das Überschreiben der Methode clone() sichergestellt werden.

Das Beispiel zeigt eine einfache Klasse mit zwei Instanzvariablen und den zugehörigen Accessor-Methoden.

public class Moped {
    private int hubraum;
    private int ps;
    
    public int getHubraum() {
        return hubraum;
    }
    public void setHubraum(int hubraum) {
        this.hubraum = hubraum;
    }
    public int getPs() {
        return ps;
    }
    public void setPs(int ps) {
        this.ps = ps;
    }
    
    @Override
    public Object clone() {
        Moped moped = new Moped();
        moped.setHubraum(hubraum);
        moped.setPs(ps);
        return moped;
    }
}

Neben den Gettern und Settern weist die Klasse noch die Methode clone() auf. Sie überschreibt java.lang.Object.clone() und ist entsprechend mit der Annotation @Override gekennzeichnet. In ihr wird ein neues Objekt der eigenen Klasse erzeugt, dessen Variablen die Werte des aktuellen Objektes übergeben bekommen. Zu beachten ist, dass die neu erzeugte Instanz als Typ Object zurückgegeben wird. Ggf. muss die geklonte Instanz dann gecastet werden.

public class CloneBsp {

    public static void main(String[] args) {
        Moped m1 = new Moped();
        m1.setHubraum(1200);
        m1.setPs(98);
        Moped m2 = (Moped) m1.clone(); // casting
        System.out.println(m1); // Moped@677327b6
        System.out.println(m2); // Moped@14ae5a5
    }
}

An der Ausgabe ist zu erkennen, dass beide Objekte unterschiedliche Speicherplätze besetzen. Möchte man an dieser Stelle einen Überblick über die Werte der Objektvariablen erhalten, so bietet es sich an, java.lang.Object.toString() zu überschreiben. Siehe hierzu den gesonderten Artikel zum Thema.
Den vollständigen Quelltext mit einer toString()-Implementierung zeigt das folgende Listing:

public class CloneBsp {

    public static void main(String[] args) {
        Moped m1 = new Moped();
        m1.setHubraum(1200);
        m1.setPs(98);
        Moped m2 = (Moped) m1.clone(); // casting
        System.out.println(m1);
        System.out.println(m2);
    }
}

public class Moped {
    private int hubraum;
    private int ps;

    public int getHubraum() {
        return hubraum;
    }

    public void setHubraum(int hubraum) {
        this.hubraum = hubraum;
    }

    public int getPs() {
        return ps;
    }

    public void setPs(int ps) {
        this.ps = ps;
    }

    @Override
    public Object clone() {
        Moped moped = new Moped();
        moped.setHubraum(hubraum);
        moped.setPs(ps);
        return moped;
    }
    
    @Override
    public String toString() {
        return "Moped [Hubraum: " + hubraum + ", PS: " + ps + "]";
    }
}