public static void feldVerdoppeln(double[] d) {
d = new double[d.length*2];
}
public static void main(String[] args) {
double[] d = new double[2];
d[0] = 0.1;
d[1] = 1.1;
feldVerdoppeln(d);
d[2] = 2.1;
System.out.println(d[2]);
}
}```
Wieso klappt das ganze nicht? Es wird doch eig. eine Referenz übergeben? Stattdessen kommt eine ArrayIndexOutOfBounds ...
Gruß Overskill
Nein, in Java gibt es ausschließlich Call by Value.
Aber hat es nicht normalerweise Auswirkugen wenn ich die Referenz in der Methode verändere? z.B.
public class Test {
public static void method(int[] i, int j) {
i[0] = i[0] + 2;
j = i[0] * 3;
System.out.println("methode: " + i[0] + " " + j);
}
public static void main(String[] args) {
int[] x = { 3 };
int[] y = { 4 };
method(x, y[0]); //Ausgabe methode : 5 15
System.out.println("Ausgabe : " + x[0] + " " + y[0]); // Ausgabe : 5 4
Wo liegt hier der Unterschied?
mfg
In main hast Du eine Referenz auf ein int-Array:
d -> {4,5}
Fall 1:
Beim Aufruf der Methode erzeugts du eine neue Referenz auf das selbe array:
d -> {4,5} <- d'
Dann weist Du in der Methode der dortigen Referenz ein neues Array zu:
d -> {4,5} | d' -> {1,2,3,4}
Dieses neue Array ist nur im Scope der Methode bekannt und wird nach dem Verlassen der Methode (bei nächster gelegenheit) vom GC abgeräumt.
Fall 2:
Beim Aufruf der Methode erzeugts du eine neue Referenz auf das selbe array:
d -> {4,5} <- d'
In der Methode änderst Du einen Wert in diesem array:
d -> {4,7} <- d'
Nach dem Verlassen der Methode ist zwar die Referenz d’ nicht mehr vorhanden, aber d in main zeigt ja immernoch auf das geänderte Array.
d -> {4,7}
bye
TT
Nein, das hat nur Auswirkungen bei Call by Reference.
Java nutzt aber wie schon gesagt Call by Value. Genauer gesagt übergibt Java hier eine Objektreferenz als Value.
Der Unterschied in deinem Beispiel ist folgender:
Mit int[] i
übergibst du ein Array (was in Java wie ein Objekt gehandhabt wird). Änderungen in diesem Objekt siehst du dann natürlich auch in deiner main-Methode. Bei int i
übergibst du nur den Wert 4. Änderungen an der lokalen Variable j haben keine Auswirkungen auf y (weils eben kein Call by Reference ist.
Das ganze kann man vermutlich besser erklären, google einfach mal nach java call by value.
Danke an euch beide. besonders durch die ausführlich Erklärung von @ Timothy_Truckle habe ich es super verstanden.
Danke ! (: