# Swap Methode



## justintime (24. Okt 2010)

Hi ich habe glaub ich ein Verständnis Problem mit der swap Geschichte.

Habe die Punkte p1 (4, 3) und p2 (8, 9) und die sollen nun vertauscht werden so am Ende steht:
p1: 8, 9
p2: 4,3

Hier mal mein Java Code:


   import java.awt.*;
   public class Test {

       public static void swap(int p1, int p2) {
           int temp = p2;
           p2 = p1;
           p1 = temp;
       }
       public static void main (String [] args) {

           Point p1 = new Point(4, 3);
           Point p2 = new Point(8, 9);
           swap(p1,p2);
           System.out.println("p1: ("+p1.x+", "+p1.y+")");
           System.out.println("p2: ("+p2.x+", "+p2.y+")");

       }
   }


Vielleicht kann mir ja einer helfen.
Danke im Voraus.


----------



## XHelp (24. Okt 2010)

... was hier stand ist quatsch ...


----------



## eRaaaa (24. Okt 2010)

```
public static void swap(Point p1, Point p2) {
		Point tmp = (Point) p1.clone();
		p1.x = p2.x;
		p1.y = p2.y;
		p2.x = tmp.x;
		p2.y = tmp.y;
	}
```


----------



## justintime (24. Okt 2010)

Cool Danke, dit klappt.

Aber kann mir das einer kurz erklären??
Das ich den Fehler hatte und zuvor p1 und p2 mit int deklariert habe ist mir bewusst.
Aber auf diesen Teil   Point tmp = (Point) p1.clone();
                                     p1.x = p2.x;
                                     p1.y = p2.y;
                                     p2.x = tmp.x;
                                     p2.y = tmp.y;
währe ich irgendwie nicht gekommen.

Danke im Voraus.


----------



## eRaaaa (24. Okt 2010)

So ganz falsch war das nicht was XHelp geschrieben hatte, bzw. er meinte wohl das Richtige.
Das p1 und p2 innerhalb der Methode sind Kopien der Referenzen aus der main! D.h. diese Referenzen haben nichts mit denen zu tun aus deiner main-Methode(schließlich hättest du sie ja auch einfach anders nennen können!)
D.h. was du gemacht hast war, du hast einfach die Referenzen der "Kopien" getauscht. Dein Code würde funktionieren, wenn du diesen direkt hinter der Deklaration der Punkte in der main schreiben würdest:

```
public static void main(String[] args) {
		Point p1 = new Point(4, 3);
		Point p2 = new Point(8, 9);
		//swap(p1, p2);
		Point temp = p2;
		p2 = p1;
		p1 = temp;
		System.out.println("p1: (" + p1.x + ", " + p1.y + ")");
		System.out.println("p2: (" + p2.x + ", " + p2.y + ")");
	}
```
Da p1 und p2 in swap aber eben andere Referenzen sind und du das so also nicht machen kannst(das würde eben nur zur Folge haben, dass p1 und p2 in swap geändert wären),

```
public static void swap(Point p1, Point p2) {
		Point temp = p2;
		p2 = p1;
		p1 = temp;
		System.out.println("p1: (" + p1.x + ", " + p1.y + ")");
		System.out.println("p2: (" + p2.x + ", " + p2.y + ")");
	}
```
 musst du eben wirklich die Werte der Objekte tauschen! (das ist ja eig. auch das was du machen willst!)


----------



## justintime (24. Okt 2010)

Vielen Dank für die ausführliche Antwort.
Echt klasse.


----------



## Marco13 (24. Okt 2010)

Mehr dazu unter den Themen "Call by value" und "Call by reference". 
(Und egal, was du sonst dazu liest: In Java gibt es NUR(!) "Call by value")


----------



## XHelp (25. Okt 2010)

Es gibt auch einen FAQ Eintrag dazu: http://www.java-forum.org/allgemeines/4904-call-value-call-reference.html


----------

