Copy-Constructor

banshee

Bekanntes Mitglied
Hi,

in der Java-Insel gibt es ja folgendes Beispiel dazu:

Java:
Player patric = new Player(); 
patric.name = "Patric Circle"; 
patric.item = "knot"; 
 
Player tryk = new Player( patric ); 
System.out.println( tryk.name );  // Patric Circle 
System.out.println( tryk.item );  // knot

Was passiert nun aber, wenn man die Attribute von patric verändert? Wenn ich mich recht entsinne, werden primitive Datentypen (und String?!) immer kopiert, aber wenn Player Objekte als Attribute hätte und man diese in patric verändert, dann ändern sie sich doch automatisch auch in tryk, weil der Verweis nur per Referenz ist oder sehe ich das falsch?
 

njans

Top Contributor
Was passiert nun aber, wenn man die Attribute von patric verändert? Wenn ich mich recht entsinne, werden primitive Datentypen (und String?!) immer kopiert,

Strings sind immutable, man kann sie nicht verändern, also ist beim Kopieren auch sichergestellt, dass da keine anderes Objekt "dran rumwursteln kann".

aber wenn Player Objekte als Attribute hätte und man diese in patric verändert, dann ändern sie sich doch automatisch auch in tryk, weil der Verweis nur per Referenz ist oder sehe ich das falsch?

Das hängt von der Implementation des Konstruktors ab. Wenn er eine Deep-copy implementierung ist, dann sind patric und tryk vollständig von einander gestrennt. Ansonsten, hast du recht. Ich kann allerdings dazu nichts sagen, da ich das Beispiel nicht offen habe.
 

banshee

Bekanntes Mitglied
Das Beispiel, um das es mir in erster Linie ging, war folgendes:

Java:
/**
 * A class representing all the machines that are currently
 * unused. 
 */
public class MachineRoom{
  private Vector<MachineInterface> machines;

  public MachineRoom(MachineRoom other){
	  machines = other.machines;
  }
  public MachineRoom(){
    machines = new Vector<MachineInterface>();
  }

   ...
}

Wenn man jetzt am Vektor in other rumspielt, ändert er sich auch in this. Scheint mir irgendwie nicht wirklich Sinn der Sache zu sein. Man müsste hier also einen neuen Vektor in this anlegen und other.machines elementweise kopieren, wenn man das Verhalten so nicht will?!
 
H

hüteüberhüte

Gast
Man muss immer zwischen flachen und tiefen Kopien unterscheiden. Im ersten Beispiel wird, da es sich um Strings handelt, eine tiefe Kopie erstellt. Wenn sich die String-Attribute in der einen Klasse durch eine Zuweisung ändern, beeinflusst das nicht die Strings in der anderen Klasse und umgekehrt. Im zweiten Beispiel wird allerdings eine flache Kopie erstellt. Änderungen der Vector-Elemente bekommen beide Klassen mit, da beide eine Referenz auf denselben Vector haben.
 
Zuletzt bearbeitet von einem Moderator:
H

hüteüberhüte

Gast
Jetzt könnte man noch hinzufügen, dass es sich immer dann um eine tiefe Kopie handelt, wenn elementeweise kopiert wird (oder wenn primitive Datentypen kopiert werden), und andernfalls um eine flache Kopie. Allerdings gibt es dabei auch Ausnahmen, wie bei String z.B., wobei nicht die einzelnen Zeichen kopiert werden, es sich aber dennoch um eine tiefe Kopie handelt, einfach weil String immutable ist.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Copy - Constructor vs clone() Java Basics - Anfänger-Themen 20
J Count und Copy in Stream<Path> Java Basics - Anfänger-Themen 11
B Copy Paste Befehl Java Basics - Anfänger-Themen 6
S Objekte klonen und Deep Copy Java Basics - Anfänger-Themen 30
B Files.copy wirft Exeption Java Basics - Anfänger-Themen 2
V java nio Files.copy Java Basics - Anfänger-Themen 10
Luk10 Arrays.copy(myArray) vs myArray.clone() Java Basics - Anfänger-Themen 9
B Eclipse Hotkeys (Copy Paste Undo Redo Save) spielen verrückt Java Basics - Anfänger-Themen 6
A Shallow copy .super.clone() Java Basics - Anfänger-Themen 2
L Array Copy Java Basics - Anfänger-Themen 7
M Cut, Copy und Paste in Symbolleiste einfügen Java Basics - Anfänger-Themen 4
A Objekt zwischen 2 Java programmen copy+Paste Java Basics - Anfänger-Themen 13
J Funktion Copy Area Java Basics - Anfänger-Themen 13
K Ich möchte in einem Text Editor cut, copy ,paste einfügen! Java Basics - Anfänger-Themen 2
C copy Java Basics - Anfänger-Themen 6
K Ant Copy Folder mit Zugriffschutz ausschliessen. Java Basics - Anfänger-Themen 2
M Cut, Copy und Paste mit mehreren Textfeldern? Java Basics - Anfänger-Themen 3
F Copy - zugriff verweigert ! Java Basics - Anfänger-Themen 5
W deep copy mehrdimensionaler Arrays Java Basics - Anfänger-Themen 11
H Deep Copy von Objekten Java Basics - Anfänger-Themen 4
H Shallow Copy von Objekten Java Basics - Anfänger-Themen 6
V Copy & "Paste" im Frame Java Basics - Anfänger-Themen 3
G Über undo, copy, cat, paste, delete Funktionen Java Basics - Anfänger-Themen 3
S Shallow Copy / Deep Copy von Objekten Java Basics - Anfänger-Themen 4
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
Fiedelbambu Exception in Application constructor Java Basics - Anfänger-Themen 3
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
U Interface | constructor injection Java Basics - Anfänger-Themen 5
R Compiler-Fehler JTable mit XML befüllen | The constructor JTable(Object[], String[]) is undefined Java Basics - Anfänger-Themen 10
F The constructor Vehikel(String, int) is undefined warum?? Java Basics - Anfänger-Themen 4
L constructor cannot be applied... Java Basics - Anfänger-Themen 22
L Constructor is undefined Java Basics - Anfänger-Themen 4
Syncopated Pandemonium Compiler-Fehler The constructor MP3File(File) refers to the missing type NoMPEGFramesException Java Basics - Anfänger-Themen 7
S CSVReader funktioniert nicht ---- The Constructor CSVReader(String) is undefined Java Basics - Anfänger-Themen 4
M Vererbung - Cannot Find Symbol constructor... Java Basics - Anfänger-Themen 11
S The constructor File(URL) is undefined Java Basics - Anfänger-Themen 10
N Klassen constructor Rückgabewert Java Basics - Anfänger-Themen 10
S Constructor und Main Methode Java Basics - Anfänger-Themen 3
S cannot find symbol, symbol: constructor Java Basics - Anfänger-Themen 2
L Erste Schritte Super Constructor mit Array - Liste? Java Basics - Anfänger-Themen 15
T Cannot refer to an instance field xxx while explicitly invoking a constructor Java Basics - Anfänger-Themen 14
M Was macht bzw. was bringt ein constructor? Java Basics - Anfänger-Themen 12
S Problem beim Kompilieren - cannot find symbol - constructor() Java Basics - Anfänger-Themen 12
W Default Constructor Java Basics - Anfänger-Themen 4
H OOP java.sql.Date does not have a no-arg default constructor Java Basics - Anfänger-Themen 2
S Array of objects und ständige Constructor-Aufrufe Java Basics - Anfänger-Themen 4
D Unhandled Exception type IOException in Constructor Java Basics - Anfänger-Themen 1
D The constructor Bestellung(Bestellung.Produkt, Bestellung.Kunde) is undefined Java Basics - Anfänger-Themen 15
B Im Constructor anderen Constructor aufrufen Java Basics - Anfänger-Themen 13
U Implementierung Constructor Java Basics - Anfänger-Themen 7
J Hilfe mit Constructor Java Basics - Anfänger-Themen 3
G The constructor is ambiguous Java Basics - Anfänger-Themen 1
S BufferedWriter undefined constructor Java Basics - Anfänger-Themen 5
I call to super must be first statement in constructor Java Basics - Anfänger-Themen 3
C Ein letzter Fehler mit dem Constructor ! Java Basics - Anfänger-Themen 17
G Constructor & Graphics g Java Basics - Anfänger-Themen 5
N Constructor.isSynthetic() Java Basics - Anfänger-Themen 4
V Problem mit Symbol constructor Java Basics - Anfänger-Themen 5
G constructor auflösen? Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben