Wieso ist eine String-Übergabe keine by-reference-Zuweisung?

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi!

Wenn ich etwas in der Art habe:

Code:
void A() {
String test = "a";
B(test);
System.out.println(test); // wieso ist test.equals("a"), und nicht test.equals("b")???
}

void B(String var) {
var = "b";
}

Wieso enthält dann nach Aufruf der B-Methode die Variable test nicht "b"? Denn da String ja ein Objekt ist und kein primitiver Datentyp, müsste die Variable var doch ein Zeiger auf die Variable test sein und somit müsste, wenn var="b" gesetzt wird, test auch "b" enthalten- oder? Wo ist mein Denkfehler?
 
weil die referenz kopiert wird, anfangs aber auf das gleiche objekt zeigt bzw nach B nicht mehr
 
Danke schonmal, aber kannst du mir vielleicht sagen, in welcher Zeile was passiert? Ich verstehe auch noch nicht, weshalb das Verhalten wie beschrieben ist, obwohl du ja schreibst, dass die Variablen "auf das gleiche objekt" zeigen?!
 
Ist es dann auch möglich, dieses Verhalten so abzuändern, dass in meinem Beispiel test am Ende wirklich "b" enthält? Also, ohne die B-Methode zur Funktion umzugestalten und ohne die Sichtbarkeit von test zu erweitern.

Verstehe ich es dann ferner richtig, dass das hier einen Effekt auf das Ursprungs-Objekt "meineklasse" hat...
Code:
// in Klasse C1
private MeineKlasse meineklasse = new MeineKlasse(); // <- das "Ursprungs-Objekt"
public MeineKlasse getMeineKlasse() {
return meineklasse;
}

// in Klasse C2
void TuWas() {
getMeineKlasse().ÄnderEinenWert(); // <- das "Ursprungs-Objekt" wird direkt verändert, richtig?
}
...die folgende Variante aber das Ursprungsobjekt unangetastet lässt, aus selbigem Grund wie von euch beschrieben:
Code:
// in Klasse C1
public MeineKlasse getMeineKlasse() {
return meineklasse;
}

// in Klasse C2
void TuWas() {
MeineKlasse eineKopie = getMeineKlasse();
eineKopie.ÄnderEinenWert(); // <- das Ursprungsobjekt  bleibt unangetastet- richtig?
}
 
nö... es wird die referenz kopiert nicht das objekt
=> beide zeigen aufs gleiche
 
Anonymous hat gesagt.:
Ist es dann auch möglich, dieses Verhalten so abzuändern, dass in meinem Beispiel test am Ende wirklich "b" enthält?
Nein. Java ist call by value. Du kannst keine Variablen ändern, die Du als Parameter übergibst, weil nur deren Werte kopiert werden und nicht die Variablen selbst.
 
Du kannst höchstens Methode B (aus Ursprungscode) einen Wert zurückgeben lassen, also mit "return" und den String test damit gleichsetzten:

Code:
void A() {

String test = "a";
test = B(test);
System.out.println(test); 

}

public String B (String var)
{

var = "b";

return var;

}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben