public class CallTest {
public static void test(int[] a) {
int [] x = new int[3];
a[1] = 3;
a = x;
}
public static void main(String [] args) {
int [] t = {5,6,7};
System.out.println(t[1]);
test( t );
System.out.println(t[1]);
}
}
Die erste Ausgabe ist klar (6)
Dann wird test aufgerufen und das Array übergeben (bei Array ist das aber call by reference?)
Neues Array x
Array a wird verändert
Die nächste Zeile (a = x) bereitet mir aber Probleme. a und x zeigen doch ab hier auf die selbe Adresse??? Wieso ist dann die nächste Ausgabe 3 und nicht 0?
Wenn ich die Methode test so abändere:
Code:
public static void test(int[] a) {
int [] x = new int[]{1,1,1};
a[1] = 3;
a = x;
for (int i:x)
System.out.print(i + "-");
System.out.print("\n");
for (int i:a)
System.out.print(i + "-");
System.out.print("\n");
}
> Wieso ist dann die nächste Ausgabe 3 und nicht 0?
in der main? die Variable t in der main zeigt immer noch auf das erste Array,
nur weil du in irgendeiner Untermethode irgendeinen Parameter etwas neu zuweist, interessiert das doch den Aufrufer nicht (unbedingt)
-----
was ist beim Zweiten die Frage?
zweimal 1, 1, 1 ausgegeben? weil x und a doch dasselbe Array sind bzw. auf dasselbe Array zeigen,
Im ersten Fall gibst du 2 Mal t[1] aus in der Methode test ist die Referenz a zwar irgendwann mal auf der neuen Speicheradresse aber in der main-Methode zeigt t immernoch auf die alte Adresse.
Danke erstmal für eure schnellen Antworten. Ganz verstanden habe ich es aber leider noch nicht.
Beim ersten Beispiel ist die Ausgabe: 6 und 3
Also wird das Array t von der Untermethode verändert!
Aber
a[1] = 3;
und
a = x;
scheinen 2 verschiedene a's zu sein (sonst müsste die Ausgabe in der main doch 6 und 0 sein) - und da verstehe ich nicht warum ...
a zeigt auf dasselbe Array wie t (Array 1),
also wirkt sich die Änderung von a auch auf das t-Array aus,
es ist ja nur ein Array da welches verändert werden könnte
> a = x;
der lokalen Variable a wird ein neues Objekt (Array 2) zugewiesen,
aber das interessiert t nicht, t referenziert immer noch das Array 1
man kann Objekte ändern, aber nicht Referenzen,
Array 1 ist ein Objekt welches gemeinsam bekannt ist,
a, x und t sind aber unterschiedliche Variablen/ Referenzen
Schon hier ist der Denkfehler: In Java wird nie etwas by reference übergeben.
Die Array-Referenz wird kopiert übergeben. Dadurch sind zwar die Objekte
in der aufgerufenen Methode veränderbar, aber niemals die Referenz auf das Array selbst. :meld: