tiefes und flaches Kopieren mit clone()
Am besten geht das mit der Clone-Methode. Es gibt zwei Möglichkeiten.
Flache Kopie
Du erstellst ein neues Objekt der zuklonenden Klasse.
Du kopierst alle Variablen (auch Objektrefernzen).
Object clone(){
A result = new result();
result.int1 = this.int1;
result.object1 = this.object1;
}
Tiefe Kopie
Du kopierst nur Variablen der Grunddatentypen (int, double, boolean, …).
Statt Objektreferenzen zu kopieren, führst du clone() für alle referenzierten Objekte aus:
@Override
Object clone(){
A result = new result();
result.int1 = this.int1;
result.object1 = this.object1.clone();
}
Im obrigen Fall muss in der Klasse von object1 die Clone-Methode überschrieben worden sein. So werden alle Klasse rekursiv geklont.
Was ist der Unterschied?
Bei einer tiefen Kopie, sind alle referenzierten Objekte ebenfalls kopiert worden.
Bei einer flachen Kopie zeigt der Pointer von kopierter und von der orginal Klasse auf das selbe Objekt.
Beispiel:
Auto auto = new Auto();
auto.setMotor(new Motor());
auto.getMotor().setPS(75);
Auto getuntesAuto = auto.clone();
getuntesAuto.getMotor().setPS(250);
getuntesAuto.printPower(); //Ausgabe: 250PS
auto.printPower(); //Ausgabe: "250PS" bei einer flachen Kopie, "75PS" bei einer tiefen Kopie.
Bei einer flachen Kopie hätten beide Autos den selben Motor (selbes Objekt). Verändert man also die PS-Zahl am getunten Auto, wird auch das normale Auto verändert. Bei einer tiefen Kopie hätte jedes Auto sein eigenes Motorobjekt. Eine PS-Änderung hätte also auch nur auf ein Auto einen Efekt.
Aber auch eine flache Kopie, hat durchaus ihren Sinn. Stellt euch die Klasse Fussgaenger vor, die ein Objekt der Klasse Stadt in der Variable aufenthalts_ort hat.
Hier wäre eine flache Kopie sinnvoll. Zwei Fußgänger können ja in der selben Stadt flanieren, aber nicht in der Kopie einer Stadt 