# Call by reference ?



## SebastianK (16. Jan 2008)

abend,

ich hab eine frage zu Call by reference und java.
das java call by value benutzt ist mir klar. aber wie siehts mit call by reference aus?

irgendwie findet man da unterschiedliche informationen. die einen sagen java benutzt es nicht und in anderen quellen heißt es dann doch das gegenteil.

wen ich arrays oder objekte an eine methode übergebe, dann ändert sich ja sehr wohl das quellobjekt, wenn es in der methode verändert wird.

benutzt nun java wirklich *nur* call by value? wenn ja, wie wird das dann bei objekten realisiert? (bei primitiven datentypen sieht mans ja sofort).
könnte man sagen java benutzt nur call by value, die arbeitsweise entspreicht jedoch im ergebnis dem von call by reference? was mir dan so vorkommt, jedoch verwirrend ist.


----------



## Beni (16. Jan 2008)

Klick mich.

Schnelle Antwort, es gibt in Java nur Call by Value.

Wird ein "Objekt übergeben", dann wird in Wirklichkeit eine Kopie der Referenz auf das Objekt erstellt und übergeben. Denn in Java hat man niemals direkten Zugriff auf ein Objekt, man geht immer über die Referenz (Eine Java-Referenz ist fast dasselbe wie ein C++-Pointer. Aber eine Java-Referenz und eine C++-Referenz sind trotz der Namensähnlichkeit sehr verschieden).

Würde es in Java Call by Reference geben, müsste sowas möglich sein:

```
String a = "A";
String b = "B";

System.out.println( a + b ); 
// Ausgabe AB

swap( a, b );

System.out.println( a + b ); 
// Ausgabe BA
```


```
public void swap( Object a, Object b ){
  Object temp = a;
  a = b;
  b = temp;
}
```


----------



## SebastianK (16. Jan 2008)

ok dein beispiel ist auf jeden fall einleuchtend und deine begründung auch.

aber ein anderes beispiel mit einem array verwirrt mich immer noch 


```
public static void main(String[] args) {
		int[] array = new int[2]; 
		array[0] = 1;
		
		for (int wert: array) {
			System.out.print(wert + " ");
		}
		
		addElement(array);
		
		System.out.println();
		
		for (int wert: array) {
			System.out.print(wert + " ");
		}
	}
	
	public static void addElement(int[] array) {
		array[1] = 2;
	}
```

hier ist die ausgabe zuerst "1 0" und nach dem methodenaufruf "1 2".
die methode hat auch keinen return-wert...das "array" in der methode "addElement()" wäre ja dann eine kopie.
bzw wie du sagst "dann wird in Wirklichkeit eine Kopie der Referenz auf das Objekt". 

jedoch hat die methode hier, anders als bei deinem beispiel mit dem string (obwohl das ja auch ein objekt ist), auswirkungen auf das quell-array.

laut der definition wäre es ja dann call by reference. 

ach irgendwie bin ich grad voll verwirrt^^ wer dankbar wenn mir nochmal wer helfen könnte!


----------



## Beni (16. Jan 2008)

Ein Array ist auch ein Object... Das "int[] array" ist lediglich die Addresse des Arrays. "addElement" bekommt die Kopie einer Addresse, aber das Ding das an der Addresse wohnt wird dadurch nicht verändert (Obwohl es mehr als ein Telefonbuch gibt, gibt es dich und dein Haus nur einmal).


----------



## Jango (16. Jan 2008)

Eine Objektvariable ist auch eine Referenz (eine Referenz auf das Objekt halt). Da sieht man es mal wieder. Objektorientierte Programmierung kann ganz schön verwirrend sein...
Was Beni vergaß, in C# gibt es auch call by reference. Die Übergabe mittels _ref_ oder _out_ kann man auch als Zeiger sehen.


----------

