Wertübergabe

JavaAnfänger1235

Bekanntes Mitglied
Hallo,
warum hat in der letzten Zeile x.a den Wert 1?
Java:
public class Aufg3 {
int a;
static int b = 1;
Aufg3() { a = 3; }
Aufg3(int n) { b = n; } // Achtung! b, nicht a
static void s(Aufg3 x, int b) {
x.a += 4;
b += 4;
}
void m(int n) {
a++;
b++;
n++;
}
public static void main(String[] args) {
Aufg3 o = new Aufg3();
Aufg3 x = new Aufg3(5);
int n = 6;
s(o, b);
// a)
System.out.println("a) " + o.a);
// b)
System.out.println("b) " + b);
b = 7;
o.m(n);
x.m(n);
// c)
System.out.print("c) ");
System.out.println(x.a );
}
}
 

VfL_Freak

Top Contributor
Moin,
durch schlechte Formatierung ist Dein Code nur schwer zu lesen !!
Du könntest besser einrücken und ggf. sprechendere Variablennamen verwenden!

Lauf mal im Debugger drüber, dann wirst Du sehen wo und wie 'x.a' verändert wird.

VG Klaus
 

MoxxiManagarm

Top Contributor
Java:
public static void main(String[] args) {
        Aufg3 o = new Aufg3(); // o.a = 3 ; b = 1
        Aufg3 x = new Aufg3(5); // o.a = 3; b = 5; x.a = 0;
     
        int n = 6; // o.a = 3; b = 5; x.a = 0; n = 6
        s(o, b); // o.a = 7; b = 5; x.a = 0; n = 6
        // ACHTUNG Falle 1 nicht b=9, da der Parameter verändert wird nicht die die statische Variable. Gleiches unten bei n.
        // ACHTUNG Falle 2 auch wenn in der Methode der Parameter x heißt, wird hier aber o verändert, nicht x
     
        // a)
        System.out.println("a) " + o.a); // sollte 7 ausgeben
        // b)
        System.out.println("b) " + b); // sollte 5 ausgeben
     
        b = 7; // o.a = 7; b = 7; x.a = 0; n = 6
        o.m(n); // o.a = 8; b = 8; x.a = 0; n = 6
        x.m(n); // o.a = 8; b = 9; x.a = 1; n = 6
     
        // c)
        System.out.print("c) ");
        System.out.println(x.a ); // sollte 1 ausgeben
    }

Hab mal die Formattierung übernommen und den Code mit erklärenden Kommentaren versehen
 

MoxxiManagarm

Top Contributor
o und x dienen an der Stelle als Container Object. Ich bin aber schlecht darin dass selbst in Worten zu erklären. Google mal Call By Value/Call By Reference in Bezug auf Java da findest du bestimmt gute Erläuterungen.
 

Meniskusschaden

Top Contributor
Warum ändert sich hier was an den Variablen. Ich hätte gedacht Java übergibt Werte mit call by Value. Was ist ist hier die Begründung?
Bei "call by value" wird eine Kopie übergeben. Das Original ändert sich also nicht. In der Zeile wurde nur n übergeben und hat sich erwartungsgemäß auch nicht verändert.
Wenn Referenzen übergeben werden, gilt dasselbe. Die Referenz wird kopiert und die Originalreferenz ändert sich nicht. Trotzdem verweisen beide Referenzen nicht nur auf ein gleiches, sondern sogar auf dasselbe Objekt, so daß Änderungen daran natürlich auch über die Originalreferenz sichtbar sind.
 

JavaAnfänger1235

Bekanntes Mitglied
Ok nochmal ganz kurz.
Das n sich nicht ändert ist klar. Es wird ja in den formalen Parameter kopiert, der zwar erhöht wird, aber dann nicht mehr existiert.
Die Klassenvariable b wird erhöht, da sie ja unabhängig vom Objekt existiert und direkt angesprochen wird.
Bleibt noch a++;
Ich wende ja die Methode auf mein Objekt o an. Da a das gleiche a ist wie bei private a deklariert, wird das a , das zu diesem Objekt o gehört, erhöht. In diesem Beispiel wird doch keine Referenz kopiert?
 

temi

Top Contributor

Ähnliche Java Themen

Neue Themen


Oben