Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich bin davon ausgegangen , dass ein String a = "abc" , den ich in einer Methode ändern will : void aendern(String s){ s = s + "def" ; }
zu "abcdef" werden müsste durch den Aufruf aendern(a), da String Referenzdatentyp ist . Wo liegt der Fehler ?
Außerdem hast du hier sowieso einen kleinen Denkfehler. In Java gibt es nur CallByValue, sprich es wird nur der Wert an die Methode übergeben und nicht eine Referenz. Daher würde eine Neuzuweisung des Parameters keine Auswirkung auf den aufrufenden Code haben!
Java:
void aendern(String s) {
s = s + "def"; // hier wird der Wert vom Parameter s mit 'def' zusammengehängt und wieder dem Parameter s zugewiesen. Da Java CallByValue ist bekommt der aufrufende Code hier sowieso nichts mit.
}
String aendern(String s) {
s = s + "def"; // hier wird der Wert vom Parameter s mit 'def' zusammengehängt und wieder dem Parameter s zugewiesen. Da Java CallByValue ist bekommt der aufrufende Code hier sowieso nichts mit.
return s;
}
Und an der Aufrufstelle steht sinngemäss was wie:
Java:
String einString = "Hier ist ein String ";
einString = aendern(einString);
Außerdem hast du hier sowieso einen kleinen Denkfehler. In Java gibt es nur CallByValue, sprich es wird nur der Wert an die Methode übergeben und nicht eine Referenz. Daher würde eine Neuzuweisung des Parameters keine Auswirkung auf den aufrufenden Code haben!
Java:
void aendern(String s) {
s = s + "def"; // hier wird der Wert vom Parameter s mit 'def' zusammengehängt und wieder dem Parameter s zugewiesen. Da Java CallByValue ist bekommt der aufrufende Code hier sowieso nichts mit.
}
Eben nicht! Es wird immer eine Referenz übergeben. Unveränderbare Typen (Immutables) sowie primitive Datentypen können jedoch wie der Name schon sagt, nicht von der Funktion verändert werden. Dadurch wird beim vermeitlichen "verändern" eine neue Instanz geschaffen und die ursprüngliche bleibt wie Sie ist.
Übergibts du die Referenz von einem Veränderbaren konstrukt, siehst du, dass es immer byRef ist:
Java:
public class Test {
public static class Mutable {
public String a = "asd";
}
private static void changeString(Mutable m) {
m.a += "fgh";
}
public static void main(String[] args) {
Mutable m = new Mutable();
System.out.println(m.a); // asd
changeString(m);
System.out.println(m.a); // asdfgh
}
}
Eben nicht! Es wird immer eine Referenz übergeben. Unveränderbare Typen (Immutables) sowie primitive Datentypen können jedoch wie der Name schon sagt, nicht von der Funktion verändert werden. Dadurch wird beim vermeitlichen "verändern" eine neue Instanz geschaffen und die ursprüngliche bleibt wie Sie ist.
Leider irrst du dich!
In deinem Beispiel übergibst du nur eine Kopie der Referenz (CallByValue), die Methode hält nun ebenfalls eine Referenz zu diesem Objekt.
Von diesem Objekt kannst du nun alle beliebigen Attribute/Eigenschaften ändern so wie du es im Beispiel machst (und diese Änderungen sind vom aufrufenden Code sichtbar). Aber das Objekt welches durch diese Referenz angesprochen wird selbst kannst du nicht überschreiben! (mittels "m = new Mutable();")
Du hast Recht. Ich habe mich ein wenig mit der Bezeichnung ByValue in die Irre führen lassen, die sich bei C/C++ anders verhält (Nämlich nicht mit einer Kopie der Referenz, sondern des Objektes).
[Hoffe ich steh grad nicht vollkommen auf dem Schlauch ]