Warum ändert sich die primitive Wrapper-Klasse nicht, nachdem sie als Argument übergeben wurde? [Duplikat]

9

Ok. Mir ist völlig bewusst, dass alle Werte in Java wertmäßig übergeben werden. Aber dieses Beispiel verhält sich nicht wie erwartet:

%Vor%

}

Da ich die Wrapper-Klasse an die changeInteger-Methode übergebe, übergebe ich ihre Adresse, also nach der Ausführung der Funktion, die meine x-Variable betreffen sollte und setze sie auf 5. Aber Eclipse sagt, dass die Ausgabe immer noch 0 ist Ich verstehe falsch?

    
Filip 16.09.2014, 10:03
quelle

6 Antworten

5

Betrachten Sie dieses Beispiel:

%Vor%

Nun ersetzen wir Integer in Ihrem Code durch die obige Klasse Wrapper :

%Vor%

Da Sie erwähnt haben, dass Sie Wertüberschreitung kennen, hoffe ich, dass es klar ist, warum dieser Code das tut, was er tut.

Kommen wir nun zu Ihrem Code zurück. Unter der Haube ist es genau derselbe Code. Der einzige Unterschied ist, dass Sie Wrapper.valueOf nicht aufrufen: Der Compiler erledigt das für Sie über autoboxing . Sobald Sie erkennen, dass dies so ist, sollte das Problem für Sie klar sein.

ByteCode von changeInteger() , um anzuzeigen, dass Integer.valueOf() aufgerufen wurde:

%Vor%     
dasblinkenlight 16.09.2014, 10:14
quelle
4

Mit x = 5; weisen Sie x in changeInteger() einen neuen Wert zu. Sie ändern den Wert des aktuellen Integer -Objekts nicht.

Der Wert von x außerhalb der Methode ist nicht betroffen.

    
micha 16.09.2014 10:05
quelle
2

Ihr Problem ist die Tatsache, dass Java pass-by-value nicht by-reference ist, also ist x in der Methode nicht das gleiche x von main. Die Tatsache, dass Integer eine unveränderliche Klasse ist, ändert hier nichts.

    
Marco Acierno 16.09.2014 10:07
quelle
2

Sie werden durch die Autobox-Funktion von Java verwirrt. Sie können einem Objekt keinen primitiven Wert zuweisen. Wenn Sie x=5 aufrufen, wird ein neues Objekt Integer mit 5 value erstellt und der Verweis auf x zugeordnet. Dies betrifft jedoch nur den Parameter im Bereich von changeIngeger , das ursprüngliche Objekt mit 0 und die Referenz von x im Hauptbereich sind unberührt.

    
holap 16.09.2014 10:22
quelle
1

Alle Java-Parameter werden nach Wert übergeben. Für alle nicht-primitiven Typen enthält der Wert einen Verweis auf das übergebene Objekt.

Für Ihr Stück Code wird das Integer-Objekt im Speicher% code% gespeichert. Ein anderer Ort A im Speicher repräsentiert die B Variable main und speichert einen Wert x .

Für den Aufruf A wird ein neuer Speicherort changeInteger erstellt und ein Wert in C (der B ist) wird dorthin kopiert. Dies ist das lokale A der Funktion x .

Mit dem Zuweisen erstellen Sie eine neue Variable, die in changeInteger gespeichert ist, und ihr Speicherort wird D zugewiesen. Dann kommst du von der Methode zurück.

Sie können sehen, dass C und A nirgendwo geändert werden und somit der Wert unverändert bleibt.

    
Danstahr 16.09.2014 10:12
quelle
0

So einfach wie es ist, alle Java Wrapper-Klassen sind Unveränderlich . Sie können also die Änderung nicht sehen.

Wenn Sie die Änderung sehen möchten, kehren Sie einfach von der Methode (nicht main ) zurück und weisen Sie sie zurück.

    
quelle

Tags und Links