Referenzparameter

Ok der Ausdruck ist vielleicht der falsche, was ich wissen will ist, ob sowas irgendwie geht:

String s1 = „a“;
String s2 = „a“;

funktion(s1, s2);

void funktion(String p1, String p2)
{
p1 = „x“;
p2 = „x“;
}

und nachher steht in s1 und s2 „x“ drin? Also wie Referenzen in C++, kann man sowas irgendwie machen? Weil ich kann ja nur einen Wert mit return zurückgeben und arrays sind auch ned so handlich…

Ich habe deine Frage nicht genau verstanden. Was ist eigentlich das Problem?

Es ist aber richtig, daß in s1 und s2 „x“ drin steht, in p1 und p2 auch. In diesem Fall hat das String-Object „x“ 4 Referencen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Die Funktion soll die Objekte ändern die ich ihr übergebe…

String ist in Java als final definiert, daher kannst du das Object nicht verändern.

Die Funktion soll die Objekte ändern die ich ihr übergebe…

Ne, so mein ich das ned… nicht das Objekt

aber wenn ich eine Funktion aufrufe wird die Objektreferenz kopiert… also nach meinem beschriebenen Code wären in s1 und s2 immernoch „a“ drin

class testString
{
String st = „hallo“;
public void hallo(String a)
{
a = „world“;

}

public static void main(String[] args)
{
testString ts= new testString();
System.out.println(„output1:st==“+ts.st);
ts.hallo(ts.st);
System.out.println(„output2:st==“+ts.st);
}
}

output1:st==hallo
output2:st==hallo

Ne, so mein ich das ned… nicht das Objekt

aber wenn ich eine Funktion aufrufe wird die Objektreferenz
kopiert… also nach meinem beschriebenen Code wären in s1 und
s2 immernoch „a“ drin

Das will ich ja eben verhindern! Ich suche eine Möglichkeit dass beim zweiten Mal ‚World‘ rauskommt statt ‚Hello‘

Das will ich ja eben verhindern! Ich suche eine Möglichkeit
dass beim zweiten Mal ‚World‘ rauskommt statt ‚Hello‘


String st = „hallo“;
public void hallo(String a)
{
st = „world“;

//oder a = „world“; st = a;
}

dass es mit st = „world“ geht is mir klar… dann benutze ich den Parameter ja auch gar ned könnte also hallo() schreiben…
zweiteres mit dem a = „world“ geht meiner Ansicht nach nicht

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich glaube langsam habe ich dich verstanden, wenn nicht, mußt du mich leider korrgieren.
Du möchtest ein String-Member-Variable durch ein Parameter in einer Methode ändern, richtig? Das geht bei String(bzw. allen den Wrappe-class) aber nicht, weil sie alle final sind. D. h. wenn du in der Methode p1 = „world“ machst, dann hast du ein neues String Object erzeugt, anstelle das von s1 zu ändern. In diesem Fall wird ein neues Object zu dem kopierten Referenz p1 gesetzt, st bleibt unverändert, weil es unveränderbar ist.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

a = „world“;
st = a;

funktioniert, probier´s mal.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

a = „world“;
st = a;

ja das schon, aber das will ich nicht, ausserdem muss der String kein Member der Klasse sein, ich will eine statische Funktion schreiben, die mir in einem String etwas ersetzt und die ich so aufrufe

replace(string, vorher, nachher)

und nicht so aufrufen muss:

string = replace(string, vorher, nachher)

a = „world“;

Das wird meiner Meinung nach nicht gehen. Warum benutzest du nicht StringBuffer? Das ist auch eine Funktion replace.

st = a;

ja das schon, aber das will ich nicht, ausserdem muss der
String kein Member der Klasse sein, ich will eine statische
Funktion schreiben, die mir in einem String etwas ersetzt und
die ich so aufrufe

replace(string, vorher, nachher)

und nicht so aufrufen muss:

string = replace(string, vorher, nachher)

Das tue ich ja auch… oh mann mir gehen langsam die erklärunen aus…

so sieht meine Funktion aus

public static String replace(String pString, String pBefore, String pAfter)
{
 // replace all occurences in string
 int pos = 0;
 while ((pos = pString.indexOf(pBefore)) \>= 0)
 {
 pString = (new StringBuffer(pString)).replace(pos, pos + pBefore.length(), pAfter).toString();
 }
 return pString;
}

Diese befindet sich in der Klasse Statics.

Nun wo ich die aufrufe mache ich

String bla =„abc“
bla = Statics.replace(bla, „a“, „x“);

rauskommen tut dann

bla: „xbc“

ok nun möchte ich aber statt

bla = Statics.replace(bla, „a“, „x“);

nur schreiben:

Statics.replace(bla, „a“, „x“);

und die Funktion soll innendrin bla ändern ohne dass ich den Rückgabewert verwenden muss.

in C++ würde sowas gehen, wenn ich den Parameter als Referenz deklarieren würde, sinngemäß irgendwie so:

replace(String& pString …

Nun frage ich mich ob in Java sowas auch irgendwie geht… in PHP gibt es z.b. sowas auch, da verwende ich etwas ähnliches, wenn ich einen String kürzen will mit shorten($string) und nicht $string = shorten($string) machen will

Das geht in Java nicht, was du da vorhast. Die Gründe habe ich schon kurz genannt: 1. String ist in Java final, 2. bei Object-Passing wird eine Kopie der Referenz erzeugt.

Der 1. Grund zieht nicht… aus meiner Funktion kommt ja ein neuer String zurück
Das 2. versuche ich schon die ganze Zeit zu erklären, und wollte eben wissen ob man das ned umgehen kann

Das geht in Java nicht, was du da vorhast. Die Gründe habe ich
schon kurz genannt: 1. String ist in Java final, 2. bei
Object-Passing wird eine Kopie der Referenz erzeugt.

Der 1. Grund zieht schon. final heißt, du kannst an das ding(was auch immer) nicht vererben und nichts ändern. Du hast aus deine Funktion ein neues String-Object zurückgeliefert, und dann an das alte Referenz zugewiesen. Das bedeutet aber nicht, daß du da was geändert hast.

Bei anderen „normalen“ Object, also was nicht final sind, wird es gehen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Jetzt kommts
Hallo,
ihr zieht ja hier ne mächtige Diskussion ab :smile:
Der String läßt sich in einer Methode nicht verändern, da bei Methodenaufrufen mit ‚primitive Datentypen‘ lokale Kopien derselben angelegt werden. Wenn Objekte übergeben werden, so werden diese nicht kopiert, sondern eine Referenz darauf übergeben. (Das stand übrigens so in nem Buch. Kommt nicht von mir)

Darum solltest du vielleicht ein Object, z.B. StringBuffer übergeben. Versuchs mal so:

void jButton4_actionPerformed(ActionEvent e)
{
StringBuffer s = new StringBuffer(„Tester“);
JOptionPane.showMessageDialog(null,"String: "+s);
replace(s,„e“,„i“);
JOptionPane.showMessageDialog(null,"String: "+s);
}

public static void replace(StringBuffer pString, String pBefore, String pAfter)
{
int pos = 0;
String helpString;
while (pos

Der String läßt sich nirgendswo verändern, und das habe ich die ganze Zeit versucht, ihm klar zu machen. Du hast es schneller geschafft als ich, aller Achtung!*lach* Ich glaube ich muß mein Deutsch noch verbessern

Der 1. Grund zieht schon. final heißt, du kannst an das
ding(was auch immer) nicht vererben und nichts ändern. Du hast
aus deine Funktion ein neues String-Object zurückgeliefert,
und dann an das alte Referenz zugewiesen. Das bedeutet aber
nicht, daß du da was geändert hast.

Wieso, das is doch nur eine Referenz
wenn ich der einfach einen neuen String zuweise?

wenn ich mache
String bla = „xyz“
bla = „abc“ das geht doch auch… ich schmeisse den ersten String weg (wird collected) und referenziere den neuen, genau das habe ich hier auch gemacht