Arrayproblem

p155

Mitglied
Hallo Leute
Ich habe folgendes Problem:
In folgendem Code möchte ich vier Elemente in einen Array dieser Elemente schreiben. Soweit funktioniert das auch. Aber wenn ich nun ein Attribut eines Elementes verändere, dem der gleiche Wert wie dem anderen Element zugeteilt ist, verändern sich beide Elemente. Also zeigt der Array ein gewisses "Pointer" - Verhalten.

Um das konkret zu machen:
Java:
package vektoren;

public class Parallelogramm {
	
	private Vektor[] vektoren = new Vektor[4];
	
	public Parallelogramm(Vektor v1, Vektor v2){		
		vektoren[0] = v1;
		vektoren[1] = v2;
		
		vektoren[2] = v1;
		vektoren[3] = v2;
	}
	
	public void bewegen(int index, int index0){
		if (vektoren[index].gibMatrix()[0] < vektoren[index].gibMatrix()[1]){
			
			vektoren[index].horizontalBewegen(vektoren[index].gibMatrix()[0]);
			
		} else if (vektoren[index].gibMatrix()[0] > vektoren[index0].gibMatrix()[1]){
			
			vektoren[index].vertikalBewegen(vektoren[index0].gibMatrix()[1]);
		}
	}
	
	public Vektor[] vektoren(){
		return vektoren;
	}
}

Wenn ich jetzt z.B.
Code:
vektoren[0]
verändere, verändert sich also auch
Code:
vektoren[2]
, weil für beide der Wert
Code:
v1
gespeichert wurde.
Ich hatte das Problem vorher noch nie! :bahnhof:

Helft mir mal bitte
 
V

vanny

Gast
Naja es wurde ja auch nicht der wert von v1 gespeichert sondern die referenz zugewiesen.

Stell dir vor, du hast ein Spielfeld wie beim Schach.
Auf A1 steht ein Turm(dein v1) dann ist die Referenz, die dort übergeben wird "das Objekt auf A1"
Wenn du den durch nen Springer ersetzt zeigen alle A1 Referenzen nichtmehr auf den Turm sondern auf den Springer, weil der jetzt auf A1 steht.^^

Ich hoffe man versteht was ich meine.

Stichwort "call by reference" und "call by value" wobei ich nicht genau weiss ob´s bei java auch unter diesen Begriffen läuft.

Gruß Vanny

[EDIT]
...Du müsstest schon Kopien von keinen Vektoren anlegen, damit dieses Verhalten nicht auftritt.
?? das verwirrt mich jetzt[/EDIT]

noch ein
[EDIT]gibts sogar hier im Forum KLICK[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
V

vanny

Gast
Habs oben schon als edit verlinkt aber ich hatte bei meinem ersten post schon ein mulmiges Gefühl mit dem call by reference, nun hab ich Gewissheit ... man lernt halt nie aus :p
 

p155

Mitglied
Du müsstest schon Kopien von deinen Vektoren anlegen, damit dieses Verhalten nicht auftritt.

Und wie mache ich das?
Ich habs schon mit
Code:
clone()
des Arrays versucht, den Vektor als einzelnen mit Cloneable versehen und dann mit
Code:
clone()
übergeben oder einfach
Code:
v1
und
Code:
v2
in andere Variablen übergeben und dann in den Array gespeichert.

Will alles nicht klappen... :bahnhof:
 

irgendjemand

Top Contributor
es gibt KEINE pointer in java ...

das was du da gemacht hast war lediglich kopieren von referenzen ...

für das was du machen willst brauchst so sog. deep-cloning ... also auch den inhalt clonen ... und nicht nur die referenz
 

faetzminator

Gesperrter Benutzer
In [c]clone()[/c] musst du einfach einen neuen [c]Vektor[/c] anlegen und die privaten Member kopieren. Ggf. musst du dort ebenfalls noch [c]clone()[/c] implementieren, dies gilt nicht für primitive Typen und immutable Objects (z.B. String). Du kannst aber auch statt [c]clone()[/c] einen Konstruktor [c]Vektor(Vektor v)[/c] implementieren, welcher die Werte von [c]v[/c] kopiert.

Edit: Sowas gibts z.B. bei den Listen, also [c]ArrayList[/c], [c]Vector[/c] etc. Siehe hier: ArrayList (Java Platform SE 6)
 

p155

Mitglied
es gibt KEINE pointer in java ...
Habe ich jemals gesagt, dass es Pointer in Java gibt?
Ich hab die Problematik nur mit "gewissen" "Pointer - Verhalten" gekennzeichnet weil ich das Verhalten, dadurch dass ich auch mal über meinen Java-Tellerrand geschaut habe, von C++ kenne.
Gerade damit keiner so einen Kommentar verfassen muss, hab ich es noch vorsichtig formuliert.

Aber es muss ja wieder irgendjemanden geben, der intuitiv sein allumfassendes Wissen zu Java preisgeben muss, ohne sich jemals die Beiträge richtig durchgelesen zu haben.

Wie dem auch sei:
Der letzte Beitrag hat mir sehr weitergeholfen, vielen Dank. Ich werds mal ausprobieren.
 
Zuletzt bearbeitet:

Oben