Referenzierungsproblem

Status
Nicht offen für weitere Antworten.
M

manni667

Gast
Mich beschäftigt gerade diese Referenzierungsproblem mit der Klasse Point bei "Java ist auch eine Insel"
klick

Code:
Point p = new Point();
Point q = p;
 
p.x = 10;
System.out.println( q.x );            // 10
q.y = 5;
System.out.println( p.y );            // 5

Wie umgehe ich das nun um 2 unabhängige Objekte zu haben, allerdings soll q dieselben Werte wie p haben?

Etwa so?
Code:
Point p = new Point();
Point q = new Point();

p.x=10;
p.y=5;

Point q = p;

// Ist q nun ein eigenständiges Objekt mit denselben Werten von p, oder ist das nun wieder nur eine Referenz auf p ?
 

byte

Top Contributor
Point p bzw. Point q sind nur die Referenzen, also Zeiger auf die eigentlichen Objekte im Speicher. Wenn Du bei q = p setzt Du die eine Referenz auf die andere. Das heisst, beide Referenzen zeigen wieder aufs gleiche Objekt.

Wenn Du zwei unabhängige Objekte mit gleichem Inhalt haben willst, dann musst Du die Inhalte explizit gleich setzen. Also z.B. so:

Code:
Point p = new Point();
Point q = new Point();

p.x = 5;
p.y = 10;

q.x = p.x
q.y = p.y;

Wenn Du sowas bei eigenen Klassen häufig benötigst, bietet es sich an, Methoden zum Kopieren bzw. Klonen des Objekts bereitzustellen. Zum Beispiel könnte man die Klasse Point um folgenden Konstruktor erweitern:

Code:
public Point(Point point) {
  this();  //falls es noch einen Default Konstruktor gibt...
  this.x = point.x;
  this.y = point.y;
}

Dann könntest Du Dir auf einfache Weise unabhängige Punkte mit gleichem Inhalt erzeugen:

Code:
Point q = new Point(p);
 
M

manni667

Gast
Hab da noch was gelesen über die Schnittstelle "cloneable". Erzeugt diese dann gleichartige Objekte?
 

SnooP

Top Contributor
Ja... die Methode clone() kopiert ein aktuelles Objekt, falls sie implementiert wurde... - und das ist der Fall, wenn cloneable implementiert ist...
Man muss aber unter Umständen halt gucken, welcher Mechanismus jetzt von der Klasse unterstützt wird... und ob man sowas wie deep-clone braucht: Was passiert, wenn die zu clonende Klasse wiederum über Attribute verfügt, die nicht primitiv sind... erneuter Aufruf von clone dieser Objekte? Was ist wenn die nicht cloneable implementieren? Was passiert, wenn dabei Zyklen entstehen... etc. ;) - das kann also insgesamt doch manchmal recht schwierig werden.

Bei dem Point ists relativ easy, da er bereits nen copy-Konstruktor besitzt, sprich man kann mit Point copyOfPoint = new Point(anotherPoint); eine Kopie von anotherPoint erstellen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Referenzierungsproblem Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben