Kopier-Konstruktor

Kalkulator

Mitglied
Hallo zusammen,

ich habe eine Frage zu Kopier-Konstruktoren.

Es gibt folgenden parametrisierten Konstruktor:

[CODE lang="java" title="Java"] public Wohnung(int neupreis, int baujahr, int zimmer, int wohnflaeche) {
super(neupreis, baujahr);
this.zimmer= zimmer;
this.wohnflaeche= wohnflaeche;
}[/CODE]

Zusätzlich soll ein Kopier-Konstruktor erstellt werden. Mein Versuch schaut aktuell so aus:

[CODE lang="java" title="Java"] public Wohnung(Wohnung wohnung) {
super(wohnung.getNeupreis(), wohnung.getBaujahr());
this.zimmer= wohnung.zimmer;
this.wohnflaeche= wohnung.wohnflaeche;
}[/CODE]

Allerdings bin ich durch Internetrecherche auch auf folgende Möglichkeiten gestoßen:

[CODE lang="java" title="Java"] public Wohnung(Wohnung wohnung) {
this(wohnung.getNeupreis(), wohnung.getBaujahr(), wohnung.zimmer, wohnung.wohnflaeche);
}[/CODE]

bzw.

[CODE lang="java" title="Java"] public Wohnung(Wohnung wohnung) {
super(wohnung);
}[/CODE]

Meine Frage: Was ist der Unterschied zwischen diesen 3 Kopier-Konstruktoren?
Welcher sollte am besten verwendet werden?
(Hinweis, falls das relevant ist: Objekte sollen mit dem Datentyp Haus der Oberklasse gespeichert werden. Jede Wohnung wird also als Haus gespeichert.)

In welchen Fällen wird in der Unterklasse zusätzlich der Konstruktor der Oberklasse benötigt?
[CODE lang="java" title="Java"] public Wohnung(Haus haus) {
super(haus);
}[/CODE]

Vielen Dank im Voraus für eure Hilfe!
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Hier ist die Frage, was vorhanden ist. Wenn Du den Konstruktor mit 4 Parametern hast, dann wird die Variante, die den Konstruktor mit nur 2 Parametern aufruft, ggf. nicht funktionieren.

Und der letzte Fall sieht dubios aus - ein Kopier-Konstruktor von Wohnung wird in der Regel nicht einen Parameter der Oberklasse entgegen nehmen, denn die Oberklasse wurde ja doch erweitert. Und es kann ja noch andere abgeleitete Klassen geben. Und spätestens da macht dann der Copy Konstruktor ja keinen Sinn. Es mag so einen Konstruktor geben, aber das ist dann kein Copy Konstruktor. Es kann also einen Konstruktor geben, der eine Wohnung erstellt und ein Hochhaus als Parameter bekommt. Aber die Wohnung ist dann natürlich keine Kopie vom Hochhaus.
 

Kalkulator

Mitglied
Ok, und welcher der Kopierkonstruktoren ist dann zu verwenden? Ich steh gerade etwas auf dem Schlauch...

Den letzten Fall lassen wir mal weg, das hätte mich nur grundsätzlich interessiert.
 

LimDul

Top Contributor
Java:
   public Wohnung(Wohnung wohnung) {
        this(wohnung.getNeupreis(), wohnung.getBaujahr(), wohnung.zimmer, wohnung.wohnflaeche);
    }
Den finde ich den angenehmsten, weil der an den bestehenden Konstruktor der Klasse Wohnung delegiert. Klappt halt nur, wenn es einen Konstruktor gibt, der auch diese 4 Parameter entgegen nehmen kann.

Java:
   public Wohnung(Wohnung wohnung) {
        super(wohnung.getNeupreis(), wohnung.getBaujahr());
        this.zimmer= wohnung.zimmer;
        this.wohnflaeche= wohnung.wohnflaeche;
    }
Der hat den Nachteil das du 2 Codezeilen hast, die identisch sind zum normalen Konstruktor. Duplizierter Code ist generell etwas, was erstmal immer ein Code-Smell ist. Wenn du z.B. dich irgendwann entscheidest und sagst, für Zimmer möchte ich aber mindestens immer eine 1 drinstehen habe bei der Erzeugung, muss du beide Zeilen anpassen mit this.zimmer = Math.max(1, ....); Im ersten Fall musst du nur einen anpassen.

Aber es kann gut sein, dass es oftmals gar keinen Konstruktor gibt, der alle Parameter entgegen nimmt oder man eh im Copy-Konstruktor Sonderlogik für die Kopierlogik braucht (wenn man z.B. eine Deep-Copy machen will, also Unterstrukturen auch kopieren will). Dann würde man eher zu der 2ten Variante tendieren.


Code:
   public Wohnung(Wohnung wohnung) {
        super(wohnung);
    }
Das wird zu 99% nicht kompilieren.
 

Blender3D

Top Contributor
Meine Frage: Was ist der Unterschied zwischen diesen 3 Kopier-Konstruktoren?
Welcher sollte am besten verwendet werden?
Ein Kopierkonstruktor in einer Java-Klasse ist ein Konstruktor, der ein Objekt mit einem anderen Objekt derselben Java-Klasse erstellt.
Wichtig
dabei ist auf tiefe Kopien zu achten.
Dieser Konstruktor passt wahrscheinlich am ehesten.
Java:
public Wohnung(Wohnung wohnung) {
        super(wohnung.getNeupreis(), wohnung.getBaujahr());
        this.zimmer= wohnung.zimmer;
        this.wohnflaeche= wohnung.wohnflaeche;
    }
Der Kopierkonstruktor sollte allerdings sicherstellen, dass das gesamte Objekt kopiert wird. In diesem Beispiel ist das aber nicht sicher gestellt.
Warum? Die Elternklasse könnte weitere Attribute besitzen, die im aufgerufenen Konstruktor nur mit Default Werten gesetzt werden.
Die Elternklasse müsste ebenfalls einen Kopierkonstruktor besitzen, der aufgerufen wird um eine vollständige Kopie zu gewärleisten.
z.B.
[CODE lang="java" title="Wohnung" highlight="6-8"]public class Wohnung extends BauObjekt {
public final int zimmer;
public final int wohnflaeche;

public Wohnung(Wohnung w) {
super(w);
this.zimmer = w.zimmer;
this.wohnflaeche = w.wohnflaeche;
}

public Wohnung(int neupreis, int baujahr, int zimmer, int wohnflaeche) {
super(neupreis, baujahr);
this.zimmer = zimmer;
this.wohnflaeche = wohnflaeche;
}
}[/CODE]
[CODE lang="java" title="BauObjekt" highlight="11"]public class BauObjekt {
public final int neuPreis;
public final int bauJahr;

public BauObjekt(int neuPreis, int bauJahr) {
this.neuPreis = neuPreis;
this.bauJahr = bauJahr;
}

public BauObjekt(BauObjekt o) {
this(o.neuPreis, o.bauJahr);
}
}[/CODE]
 

fhoffmann

Top Contributor
Wichtig dabei ist auf tiefe Kopien zu achten.
Das muss nicht immer korrekt sein sondern hängt von der Anwendung ab.

Hat beispielsweise eine Wohnung einen besitzer von der Klasse Person, so stellt sich die Frage, ob ich wirklich eine tiefe Kopie möchte.
Inhaltlich bedeutet dies:
Wenn ich von dem besitzer der ersten Wohnung die Telefonnummer ändere, soll sich dann auch die Telefonnummer des besitzer der kopierten Wohnung automatisch mit ändern?
 

Blender3D

Top Contributor
Das muss nicht immer korrekt sein sondern hängt von der Anwendung ab.
Das ist richtig. Mein Statement bezieht sich beim Kopieren immer auf tiefe Kopien zu achten. Selbstverständlich abhängig vom Kontext.
Anfänger sind sich aber beim Kopieren der Bedeutung von flachen und tiefen Kopien nicht bewusst. Es wird automatisch eine flache Kopie gemacht.
Und sie wundern sich dann wenn zwei unabhängige Objekte erzeugt werden sollen, dass sich Werte im kopierten Objekt auch ändern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
T Schlüsselworte Schlüsselwort this im Konstruktor Java Basics - Anfänger-Themen 3
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
J Konstruktor Java Basics - Anfänger-Themen 18
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
G Welche Attribute kommen in den Konstruktor? Java Basics - Anfänger-Themen 5
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Konstruktor und update Java Basics - Anfänger-Themen 4
S Default Konstruktor Java Basics - Anfänger-Themen 7
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
J Vier gewinnt in Java,Spieler Konstruktor Java Basics - Anfänger-Themen 8
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
Zeppi OOP Bruch kürzen im Konstruktor Java Basics - Anfänger-Themen 2
HorstSchröder Konstruktor mit Initialwert Java Basics - Anfänger-Themen 1
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
H Generische Konstruktor Java Basics - Anfänger-Themen 12
MiMa Seltsames Verhalten im Konstruktor Java Basics - Anfänger-Themen 6
S Konstruktor passt nicht zum Rest Java Basics - Anfänger-Themen 11
C Unbekannter "Konstruktor"?? Java Basics - Anfänger-Themen 10
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
R Objekt in Konstruktor ist nicht zulässig Java Basics - Anfänger-Themen 5
A Mit einer Methode den Konstruktor aufrufen? Java Basics - Anfänger-Themen 2
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
H Unterschied Konstruktor und Klassenname x = new Klassenname; Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
E Konstruktor mit Methode Java Basics - Anfänger-Themen 7
E ArithmeticException im Konstruktor Java Basics - Anfänger-Themen 4
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
F Konstruktor richtig implementiert? Frage zu Benutzereingaben... Java Basics - Anfänger-Themen 9
W Typecastin im Konstruktor? Java Basics - Anfänger-Themen 2
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
F Arrays im Konstruktor Java Basics - Anfänger-Themen 5
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
L Instanzvariablen, Veerbung, Konstruktor Java Basics - Anfänger-Themen 32
E Best Practice Konstruktor mit bestehender Intanz der gleichen Klasse aufrufen Java Basics - Anfänger-Themen 4
E Plausibilitätsprüfung in dem Konstruktor mit Ausnahmebehandlung Java Basics - Anfänger-Themen 8
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
D Compiler-Fehler Konstruktor von Superklasse übernehmen Java Basics - Anfänger-Themen 1
P Counter im Konstruktor Java Basics - Anfänger-Themen 11
J toString-Methode in Verbindung mit varArgs-Konstruktor Java Basics - Anfänger-Themen 18
I Einträge in den Konstruktor Java Basics - Anfänger-Themen 3
Aprendiendo [JAVA-Syntax] (int... variable) bei einem Konstruktor Java Basics - Anfänger-Themen 8
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Datentypen Warum mit Konstruktor Objektvariablen initalisieren? Java Basics - Anfänger-Themen 19
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
P Konstruktor. Java Basics - Anfänger-Themen 4
D Best Practice Objekt automatisch im Konstruktor füllen? Java Basics - Anfänger-Themen 9
D Objekt oder Konstruktor Java Basics - Anfänger-Themen 2
F Java default Konstruktor Java Basics - Anfänger-Themen 1
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
T Konstruktor mit Referenzdatentypen Java Basics - Anfänger-Themen 5
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
R ArrayList im Konstruktor. Java Basics - Anfänger-Themen 4
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
J Wie lässt sich der Konstruktor einer Klasse einer Funktion einer Klasse nutzen. Java Basics - Anfänger-Themen 4
S Variable, die im Konstruktor gesetzt wird, wird nicht gefunden vom Compiler. Java Basics - Anfänger-Themen 4
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
W Konstruktor von FileInputStream nicht gefunden Java Basics - Anfänger-Themen 18
B Methoden Konstruktor im Konstruktor aufrufen Java Basics - Anfänger-Themen 2
N Aufgabe: Pizza Konstruktor mit mehreren beliebigen Durchmesser/Preiskombinationen Java Basics - Anfänger-Themen 8
K arraygröße durch variablen Konstruktor? Java Basics - Anfänger-Themen 7
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
X Übergabeparameter Konstruktor (File) Java Basics - Anfänger-Themen 13
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
C Konstruktor in Abstrakten Klassen Java Basics - Anfänger-Themen 4
B Konstruktor Problem Java Basics - Anfänger-Themen 8
Joew0815 konstruktor und damit erstellte objekte Java Basics - Anfänger-Themen 1
K Hashtable mit eigenen Konstruktor Java Basics - Anfänger-Themen 2
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
H Fehler im Konstruktor abfangen Java Basics - Anfänger-Themen 10
J Konstruktor Problem bei Vererbung Java Basics - Anfänger-Themen 1
I Java Eingabe aus einer anderen Klasse in eine andere an Konstruktor übergeben Java Basics - Anfänger-Themen 4
O Konstruktor und Default Konstruktor Java Basics - Anfänger-Themen 7
S Kapselung Objekt bei Übergabe an Konstruktor nicht initalisiert Java Basics - Anfänger-Themen 3
I Vererbung Frage zum Konstruktor Java Basics - Anfänger-Themen 5
Y Konstruktor - Setter/Getter Java Basics - Anfänger-Themen 3
P Konstruktor Java Basics - Anfänger-Themen 4
E Initialisierung von Attributen und Konstruktor Java Basics - Anfänger-Themen 0
H Compiler-Fehler NullPointerException bei .length, Konstruktor fehlerhaft? Java Basics - Anfänger-Themen 3
M Objekt Array an konstruktor übergeben und Initialisieren Java Basics - Anfänger-Themen 1
llabusch Vererbung Super Konstruktor Java Basics - Anfänger-Themen 5
P Erste Schritte WindowBuilder erstellt Konstruktor wie zugreifen Java Basics - Anfänger-Themen 5
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
V Was soll alles in den Konstruktor? Java Basics - Anfänger-Themen 3
J Objektwerte addieren / Konstruktor Java Basics - Anfänger-Themen 19
J Konstruktor implementieren, zahl 0 repräsentieren Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben