# Werte tauschen



## macwinnie (8. Dez 2009)

Hallo zusammen!

Ich bin noch ein relativer Java-Frischling ... und habe hier mal ne Frage 


```
public class Exchange
	{
	public static void swap (int i, int j)
	 	{
			int c = i;
			i = j;
			j = c;
		}
		
	public static void main (String[] args)
		{
			int x = 1;
			int y = 2;
			swap(x,y);
			System.out.println(x + "\n" + y);
		}
	}
```

rein theoretisch sollte doch die Methode "swap" in der "main"-Methode die Werte von x und y vertauschen, oder? ... weil wenn ich dieses Programm jetzt so wie es ist compiliere und dann ausführe gibt mir das Programm folgendes in der Console aus:

===========
java Exchange
1
2
===========

... kann mir jemand den Fehler sagen, bzw. warum das so ist? (P.S.: es handelt sich hier NICHT um eine Hausaufgabe!!!)

Merci,

macwinnie

Anmerkung: ich arbeite mit der aktuellsten Java-Version für MacOS X Snowleopard.


----------



## Der Müde Joe (8. Dez 2009)

Java ist leider kein C. Hier werden nicht die Referenzen übergeben sondern die values kopiert und übergeben. änderst du was an den werten, andert sich nix an der orginialen in der de main (Achtung bei Objekten kann sich intern sehr wohl was ändern)


----------



## Templon (8. Dez 2009)

macwinnie hat gesagt.:


> rein theoretisch sollte doch die Methode "swap" in der "main"-Methode die Werte von x und y vertauschen, oder?



Nein das tut sie nicht. Du übergibst der Methode nur eine Kopie des Wertes (Call By Value). Das Original wird also in der Methode nicht geändert.

Hier noch eine wenig mehr dazu: http://www.java-forum.org/allgemeines/4904-call-value-call-reference.html


----------



## Michael... (8. Dez 2009)

Bei primitiven Datentypen, wie hier den ints werden nur die Werte übergeben, d.h. x und y in der main bleiben unverändert. Wenn Du Dir i und j in der swap-Methode vor und nach dem Vertauschen ausgibst wirst Du sehen, dass sie innerhalb der Methode getauscht werden.


----------



## KrokoDiehl (8. Dez 2009)

Du erwartest hier so genannte _Call by Reference_ Parameter. Das geht in Java zwar, nur bei so genannten _Immutables_ nicht, wozu int gehört. D.h. die ints in 
	
	
	
	





```
swap()
```
 sind Kopien der ints aus 
	
	
	
	





```
main()
```
.


----------



## Michael... (8. Dez 2009)

Mensch vier Antworten innerhalb einer Minute - Respekt


----------



## Ebenius (8. Dez 2009)

macwinnie hat gesagt.:


> rein theoretisch sollte doch die Methode "swap" in der "main"-Methode die Werte von x und y vertauschen, oder?


Die Methode tauscht die Werte nur in der Methode [c]swap[/c], in [c]main[/c] findet der Tausch nicht statt. In Java sind alle Parameter einer Methode sogenannte Wertparameter (Wikipedia). Referenzparameter (Wikipedia) wie sie etwa in Pascal oder C existieren gibt es in Java hingegen nicht.

Wenn die Artikel oben nicht genug erklären, frag einfach nochmal genauer nach.

[Edit] Da geht man nur mal zur Tür um die Leute von der Müllabfuhr ins Haus zu lassen und schon ist man nicht mehr der erste, sondern der sechste der antwortet. 

Ebenius


----------



## faetzminator (8. Dez 2009)

Genau genommen bei _immutable objects_ und _primitives_. [c]int[/c] ist ein primitiver Typ, kein Immutable


----------



## Templon (8. Dez 2009)

KrokoDiehl hat gesagt.:


> Du erwartest hier so genannte _Call by Reference_ Parameter. Das geht in Java zwar...



Nope das geht in Java nicht =) Call by value auf eine Referenz != Call by reference.


----------



## macwinnie (8. Dez 2009)

WOW 

Merci euch allen für die extrem schnellen Antworten!!!

Ich glaub, mit den Links, auf die ihr mich verwiesen habt, kann ich was anfangen 

vlg,

macwinnie


----------



## Ebenius (8. Dez 2009)

Da Du neu im Forum bist (Willkommen!), schau mal hier: http://www.java-forum.org/forum-faq-beitraege/86306-thema-erledigt-markieren.html

Hab ich in diesem Thema für Dich gemacht; das nächste mal weißt Du wie's geht.

Happy Hacking!
Ebenius


----------

