falseSwap

Status
Nicht offen für weitere Antworten.

kulturfenster

Bekanntes Mitglied
Ich habe eine kleine Aufgabe, die ich nicht verstehe:

Code:
public class tester
{
	public static void falseSwap(double a, double b)
	{
		double temp = a;
		a = b;
		b = temp;
	}
	
	public static void main(String[] args)
	{
		double x = 3;
		double y = 4;
		falseSwap(x,y);
		System.out.println(x + " " + y);
	}
}
Why doesn't the method swap the contents of x and y?

Vielen Dank!
 

Drake

Bekanntes Mitglied
Hallo

wenn ich die Aufgabe richtig verstanden habe geht es hier ums Grundverständniss

deine falseSwap vertauscht intern schon die beiden Variablen, und trotzdem bekommt deine Ausgabe davon nichts mit, weil die vertauschten Werte nirgendwo wieder zurück gegeben werden.

mfg
Drake
 

Chris_1980

Bekanntes Mitglied
na weil du ja nicht x und y swapst sondern a und b. Das da würde mit Objekten funktionieren, nicht aber mit primitiven Datentypen.
 

Drake

Bekanntes Mitglied
der Fehler liegt darin, dass deine Methode zwar intern (beim Aufruf, also in der Methode selbst) swapt, aber deine Variablen x,y davon nichts mitkriegen, sie werden ja nirgendwo auf die geswapten Werte gesetzt.

Es würde auch nichts ändern, wenn du in der swap Methode a und b durch x und y ersetzt, da es komplett andere Variablen sind die mit denen im Hauptprogramm nichts gemeinsam haben.

Deswegen sag ich ja in der Aufgabe geht es um das Grundverständniss, wann Varibalen bezug zu einander haben und wann sie von einander komplett unabhängig sind

Berufsschule?
 

Leroy42

Top Contributor
Chris_1980 hat gesagt.:
na weil du ja nicht x und y swapst sondern a und b. Das da würde mit Objekten funktionieren, nicht aber mit primitiven Datentypen.

Auch mit Objekten würden x und y nicht geswappt.
Nur ihre Inhalte vertauscht.
 

WieselAc

Top Contributor
Hier mal ein Beispiel, vieleicht wirds klarer;

Code:
public class Temp {

    private class Zahl {
        private int zahl;

        private Zahl(int zahl) {
            this.zahl = zahl;

        }

        public int getZahl() {
            return zahl;
        }

        public void setZahl(int zahl) {
            this.zahl = zahl;
        }
    }

    private Temp() {
        Zahl a = new Zahl(5);
        Zahl b = new Zahl(10);

        System.out.println("SWAP 1:");
        System.out.println("vor\t a=" + a.getZahl() + "  b=" + b.getZahl());
        swap1(a, b);
        System.out.println("nach\t a=" + a.getZahl() + "  b=" + b.getZahl());

        System.out.println();

        System.out.println("SWAP 2:");
        System.out.println("vor\t a=" + a.getZahl() + "  b=" + b.getZahl());
        swap2(a, b);
        System.out.println("nach\t a=" + a.getZahl() + "  b=" + b.getZahl());
    }

    /**
     * So gehts nicht
     */
    private static void swap1(Zahl a, Zahl b) {
        Zahl tmp = b;
        b = a;
        a = tmp;
        System.out.println("in\t a=" + a.getZahl() + "  b=" + b.getZahl());
    }

    /**
     * So gehts
     */
    private static void swap2(Zahl a, Zahl b) {
        int tmp = b.getZahl();
        b.setZahl(a.getZahl());
        a.setZahl(tmp);
        System.out.println("in\t a=" + a.getZahl() + "  b=" + b.getZahl());
    }

    public static void main(String[] args) {
        new Temp();
    }

}
 

kulturfenster

Bekanntes Mitglied
vielen Dank für das Beispiel!

Ich seh nun den Unterschied, verstanden hab ichs jedoch noch nicht ganz. Muss ich mich dafür ins Thema "Call by value/reference" vertiefen? Kurz: Wieso funktioniert es, wenn man Methoden verwendet? Was ist der Unterschied zwischen "a = b" und "b.setZahl( a.getZahl() )"?

Zudem sind noch weitere, ältere Fragen aufgetaucht:

was ist "private temp {...}" genau? ein privater Konstruktor? Wieso muss das Ding privat sein?

Wie kann man umschreiben, was in der Main-Methode geschieht? Es wird eine Referenz zum temp-Objekt erzeugt?
 

Marco13

Top Contributor
was ist "private temp {...}" genau? ein privater Konstruktor?
Ja
Wieso muss das Ding privat sein?
Er muss nicht private sein, aber er kann private sein. Und "private sein können" heißt "private sein müssen" (oder zumindest "private sein sollen". Man sollte alles private machen, was private sein kann.
Wie kann man umschreiben, was in der Main-Methode geschieht? Es wird eine Referenz zum temp-Objekt erzeugt?
Nochmal Ja


Ich seh nun den Unterschied, verstanden hab ichs jedoch noch nicht ganz. Muss ich mich dafür ins Thema "Call by value/reference" vertiefen? Kurz: Wieso funktioniert es, wenn man Methoden verwendet? Was ist der Unterschied zwischen "a = b" und "b.setZahl( a.getZahl() )"?

Das Beispiel ist nicht unbedingt ein gutes Beispiel für "Call by Reference". Dort wird eigentlich in beiden Fällen ein "Call by Value" gemacht wird. (Und die "value" ist in diesem Fall die Referenz :D )


Stell dir das vielleicht so vor:
Zahl a = new Zahl(5);
Zahl b = new Zahl(10);
Hier sind 'a' und 'b' Referenzen auf "ECHTE Zahl-Objekte". Wenn man nun eine Methode hat wie
Code:
private static void swap(Zahl x, Zahl y) ...
und ruft die auf mit
swap(a,b);
dann werden dort die Referenzen übergeben. In der Methode kommen aber nur Kopien der Referenzen a und b an. Diese Kopien heißen in der Methode dann x und y. Wenn man nun x und y vertauscht, hat das auf die Referenzen a und b keinen Einfluß (weil ja nur ihre KOPIEN vertauscht werden).
Wenn man stattdessen dann x.setZahl(y.getZahl()) macht, dann werden die Eigenschaften der Objekte verändert, auf die die Referenzen verweisen (x/y und a/b verweisen ja auf dieselben Objekte - nämlich die "ECHTEN Zahl-Objekte", die oben angelegt wurden)

Aber nochmal: Hier wird in beiden Fällen "Call by value" gemacht.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben