Verständnisfrage zu Java-Ausgabe

Horst123

Neues Mitglied
Versuche gerade Java zu lernen und würde gerne wissen, ob ich das richtig verstanden habe:
Wäre die Ausgabe des untenstehenden Code-Fragments:
1: 1
2: 1
3: 1
4: 1
Sehe ich das richtig, dass die int-Variable n, die zu Beginn der start-Methode erzeugt und mit 0 initialisiert wird, nicht identisch ist mit der Klassenvariablen this.n vom Objekt zahl und deshalb this.n auch nach dem Aufruf von calc(n) noch bei 0 steht?
Oder sind beide Variablen/Objekte identisch und die Ausgabe ist deshalb bei 3+4 jeweils 2 statt 1?


Gegeben sei die folgende Klasse Zahl:
public class Zahl {
public int n;
public Zahl(int n) {
this.n = n;
}
}

Vollziehen Sie die Ausführung des folgenden Java-Programmfragments beim
Aufruf von start() nach. Notieren Sie die erzeugten Ausgaben und erläutern
Sie kurz die Gründe für eventuelle Unterschiede und Gemeinsamkeiten der
ausgegebenen Werte.

void calc(int n) {
++n;
System.out.println("1: " + n);
}

void calc(Zahl zahl) {
zahl.n++;
System.out.println("3: " + zahl.n);
}

void start() {
int n = 0;
Zahl zahl = new Zahl(0);
calc(n);
System.out.println("2: " + n);
calc(zahl);
System.out.println("4: " + zahl.n);
}
 
Sehe ich das richtig, dass die int-Variable n, die zu Beginn der start-Methode erzeugt und mit 0 initialisiert wird, nicht identisch ist mit der Klassenvariablen this.n vom Objekt zahl und deshalb this.n auch nach dem Aufruf von calc(n) noch bei 0 steht?

Edit: Sehe gerade das ich quatsch geschrieben habe. Schlecht eingerückt! ;-)

Also du hast ja eine Klasse Zahl mit einer globalen Variable
Code:
n
. Auf diese greifst du in dem Konstruktor mit
Code:
this.n
zu. Denn in dem Konstruktor
Code:
Zahl(int n)
deklarierst du ja noch eine lokale Variable
Code:
n
.

Dann weist du mit
Code:
this.n = n
der globalen Variable
Code:
n
den Wert der lokalen Variable
Code:
n
zu.

Die anderen Methoden befinden sich jetzt außerhalb der Klasse Zahl. Deswegen hatte ich das eben beim überfliegen falsch gesehen. In der Methode
Code:
start
initialisierst du, wie du richtig gesagt hast eine neue Variable
Code:
n
. Diese hat nichts mit der Variable
Code:
n
in der Klasse
Code:
Zahl
zu tun. Weder mit der globalen, noch mit der lokalen.

Deswegen erhöht sich nach dem Aufruf der Funktion calc(n) die lokale Variable
Code:
n
der Methode
Code:
start
. Nicht aber die Variable
Code:
n
in dem Objekt der Zahl.

Du kannst dir aber auch eine main-Methode schreiben und das ganze mal selber ausprobieren.
 
Zuletzt bearbeitet:
Vielen Dank für die Erklärung, dann hab ich's richtig verstanden, wobei deine Ausführung das noch mal verständlicher gemacht hat.
Werde das ganze heute Abend auch noch ausprobieren, kann das nur derzeit leider noch nicht, deshalb wollte ich hier kurz die nachfragen, um sicherzugehen, dass ich den Part verstanden habe, bevor ich weiterlese.
 
primitive datentypen werden immer nur kopiert, andres als objekten, bei denen nur dir referenz kopiert wird. Dann schau dir noch Scope an, damit du verstehst, welche Variable wo bekannt ist und verändert wird.

Code:
1
0
1
1
ist übrigends die ausgabe

n wird 0 gesetzt

ein neues objekt Zahl wird erstellt, mit startwert 0 für die int instantzvariable und in die Referenz auf das Objekt in der Variable zahl gespeichert

der Wert aus n wird in die calc-Methode kopiert, dort inkrementiert und ausgegeben
das n in start bekommt davon nicht mit und ist immernoch 0

die Referenz aus zahl auf das Objekt Zahl wird ins zweite calc kopiert
das int attribut vom Zahl Objekt an der übegebene Referenz wird inkrementiert

da die variable zahl immernoch die selbe Referenz kennt, ist nun auch in start die Eröhung bekannt
 

Zurück
Oben