Warum wird Array durch Methode ohne Rückgabewert verändert?

jabo

Mitglied
Hallo,

warum wird ein Array verändert, wenn man es einer Methode übergibt, die die Einträge des übergebenen Array verändert, aber kein Array zurückgibt, aber ein z.B. ein int (als Beisiel für einen primitiven Datentyp) oder String (als Beispiel für einen Referenztyp) nicht?
Auf ein Array hat eine Methode offensichtlich einen Seiteneffekt, warum? Ich dachte Parameter werden in Java per call-by-value übergeben?

Zur Verdeutlichung meiner Frage folgenden Codeabschnitt:
Java:
public static void main(String[] args) {
	int[] a = {1,2,3,4,5,6,7,8,9};	
	setTo2(a);
		
	 for (int zahl : a)
		 System.out.printf("%d ", zahl);   // 2 2 2 2 2 2 2 2 2
	 System.out.printf("\n");
		
	 int b = 1;
	 setTo2(b);
         System.out.println(b);   // 1
		
	String c = new String("eins");
	setTo2(c);
	System.out.println(c);   // eins
	}
	
	static void setTo2(int[] array) {
		for (int i = 0; i < array.length; i++) {
			array[i] = 2;
		}
	}
	
	static void setTo2(int arg) {
		arg = 2;	
	}
	
	static void setTo2(String arg) {
		arg = "zwei";	
	}
}

Über eure Hilfe würde ich mich freuen.
Vielen Dank!
 
ok, und bei String wird auch die Referenz auf den String übergeben? Dann müsste der String durch die Methode setTo2(String arg) ja auch geändert werden, wie das Array durch setTo2(int[] array) geändert werden? Wird er aber ja nicht und der int auch nicht.
 
Das liegt daran, dass ein Array nicht wirklich eine Variable ist sondern nur ein Container für Variablen.

In meinen Augen ist das tatsächlich eine inkonsistenz in der Java Definition. Das wurde aber sicherlich mit Absicht gemacht, da sonst bei der Übergabe von einem Array von mehreren hundert tausend Einträgen die immer komplett im Speicher kopiert werden müßten, was sehr schnell zu einem out of memory führt wenn man das Array durch ein paar Ebenen reicht. Bei Listen und anderen Collections ist das genauso.

Gruß

Claus
 
ok, und bei String wird auch die Referenz auf den String übergeben? Dann müsste der String durch die Methode setTo2(String arg) ja auch geändert werden, wie das Array durch setTo2(int[] array) geändert werden? Wird er aber ja nicht und der int auch nicht.

Bei primitiven Datentypen: int, long, double usw. wird nur eine Kopie des Wertes übergeben (also wirkliches Call-by-value).
String ist ein Objekt, hier wird tatsächlich nur eine Referenz übergeben. Aber String ist eine immutable Klasse, sprich der Wert von einem String Objekt kann sich nicht ändern sondern es muss immer ein neues String Objekt erzeugt werden.
 
Vielen Dank für eure Antworten!

Bei primitiven Datentypen: int, long, double usw. wird nur eine Kopie des Wertes übergeben (also wirkliches Call-by-value).
String ist ein Objekt, hier wird tatsächlich nur eine Referenz übergeben. Aber String ist eine immutable Klasse, sprich der Wert von einem String Objekt kann sich nicht ändern sondern es muss immer ein neues String Objekt erzeugt werden.
Das erklärt es! Ich habe es jetzt mal mit anderen mutable Objekten ausprobiert und siehe da, es verhält es sich wie mit den Arrays. Als Beispiel:
Java:
static void main(String[] args) {
      Date d = new Date(2015, 3, 10);
      setToYesterday(d);
      System.out.println(d);   // Fri Apr 09
}

static void setToYesterday(Date date) {
	date.setDate(9);
}
Also nochmals vielen Dank an alle!
 
Zuletzt bearbeitet:

Zurück
Oben