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?
Betrachten Sie dieses Beispiel:
%Vor% Nun ersetzen wir Integer
in Ihrem Code durch die obige Klasse Wrapper
:
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:
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.
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.
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.
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.
Tags und Links java