Frage von Paranormal43, 33

Java Referenzen und Objekte?

Hallo Leute, hier ist erstmal der Quellcode:

public class Test {
    
    public static void main(String[] args) {
        
    Integer a = new Integer(100);
    Integer b = a;
    
    System.out.println("a = " + a);
    b = 10;
        System.out.println("a = " + a);
    }
}

Es existiert nur ein Objekt und zwei Referenzvariablen, und wenn ich es richtig verstanden habe müsste da

a = 100

a = 10

stehen. Aber bei mir kommt ein anderes Ergebnis raus. Integer ist die Wrapper-Klasse für den primitiven Datentyp 'int' und ist somit ein Referenztyp und kein primitiver Typ, oder nicht ? Kann es mir jemand erklären ?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Schachpapa, 15

Integer b = 10;

darf man erst seit Java 5 so schreiben. Bis dahin musste b entweder der primitive Datentyp int sien oder man erzeugte explizit ein neues Integer-Objekt entweder mit new Integer(10) oder mit Integer.valueOf(5)

Seit Java5 geht das automatisch (Autoboxing), d.h. es wird ein neues Objekt erzeugt und b zeigt darauf. Es wird nicht der Wert des Objekts verändert, auf das a zeigt.

Antwort
von oelbart, 22

Wenn Du den internen Wert eines Objektes ändern willst, müsstest Du das ja irgendwie über eine "set" Funktion machen und nicht einfach, indem Du der Variable, die auf das Objekt zeigt, einen neuen Wert übergibst. (Es ist kein Pointer, falls Du aus der C-Welt kommst)

Da ich in der Doc gerade keine set-Funktion für Integer finde, würde ich mal vermuten, dass Dein
b = 10;
als
b = new Integer(10);
interpretiert wird.

Expertenantwort
von TeeTier, Community-Experte für programmieren, 17

Die Wrapper für einfache Typen in Java sind unveränderlich! :)

Wenn du ...

Integer b = a;

... schreibst, ist b zwar eine Referenz, zeigt aber nicht auf "a", sondern auf ein implizit neu erzeugtes (ebenfalls unveränderliches = immutable) Objekt.

Sinngemäß ist es das gleiche wie ...

Integer b = new Integer(a.intValue());

... der Wert von "a" wird also kopiert!

Und wenn du ...

Integer b = 10;

... schreibst, wird implizit einfach ebenfalls ein neues Wrapper-Objekt angelegt:

Integer b = new Integer(10);

Du kannst den Wert eines einmal erzeugten Wrappers als nicht mehr ändern. Das gilt insbesondere für den Zuweisungsoperator!

Allerdings vermischt deine Frage das Thema "Autoboxing / Unboxing" mit den Themen "Mutability" und "Referenzen", was vermutlich der Grund für deine Verständnisprobleme ist.

Ich kann von daher schon verstehen, dass du leicht verwirrt bist. :)

Aber mach dir keine Sorgen, so kompliziert ist das alles nicht! Frag einfach Google oder Wikipedia nach den oben stehenden fett markierten Themen, dann sollten sich alle Ungereimtheiten klären.

Viel Spaß! :)

Antwort
von TUrabbIT, 20

Wenn ich das richtig verstehe verändert sich a nach Initialisierung mit dem Wert 100 nicht mehr. Somit müsste zweimal a = 100 herauskommen

Antwort
von triopasi, 12

Teste das ganz mal mit Strings, Arrays und nem eigenen Typ. Das sollten alles Referenzdatentypen sein.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten