Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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.
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
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?
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 )
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.