Detaillierte Erläuterung des Java -Packens und Unboxens
Vorwort:
Um die Konzepte des Verpackens und Unboxens zu verstehen, müssen Sie Java -Datentypen verstehen
Box: Packung Grundtypen mit ihren entsprechenden Referenztypen, damit sie die Eigenschaften von Objekten haben. Int in Ganzzahl verpackt, float in float verpackt
Unboxing: vereinfacht im Gegensatz zum Boxen Objekte von Referenztypen zu Daten von Werttypen
Ganzzahl a = 100;
Siehe den folgenden Code
M1
public class dataType {public void main (String args []) {DataType dt = neuer DataType (); Eger a = New Integer (128); System.out.println ("M12 -Ergebnis" + (a == b));Was sind die Druckergebnisse?
M11 -Ergebnis Falsch M12 Ergebnis falsch
"==" vergleicht die Adresse, während die Adressen der beiden Objekte A und B unterschiedlich sind, dh sie sind zwei Objekte, also sind beide falsch
Bytecode durch Javap analysieren, der Inhalt lautet wie folgt
public void m11 (); A/Lang/Integer; Java/Lang/System.out: Ljava/IO/Printstream; 30: IF_ACMPNE 37 33: ICONST_1 34: GOTO 38 37: ICONST_0 38: InvokeVirtual #66; Java/Lang/StringBuilder.Append: (z) ljava/lang/StringBuilder; : Return Public Void M12 (); // Methode Java/Lang/Ganzzahl : Neue #59; Invokespecial #63; InvokeVirtual #74;
M2
öffentlicher Klassen -Datentyp {statische void -Hauptdarsteller []) {DataType dt = neuer DataType (); OID M22 () {Integer a = New Integer (128); Integer (128);Das Druckergebnis ist
M21 -Ergebnis Falsem22 Ergebnis falsch
A und B sind noch zwei Objekte
Javap Parsing -Inhalt
public void m21 (); ; // Methode Java/Lang/Ganzzahl Java/Lang/System.out: Ljava/IO/Printstream; OAD_2 34: IF_ACMPNE 41 37: ICONST_1 38: GOTO 42 41: ICONST_0 42: InvokeVirtual #66; Java/Lang/StringBuilder.Append: (z) ljava/lang/StringBuilder; : returnPublic void M22 (); // Methode Java/Lang/Ganzzahl : Ljava/io/printstream; 47: Invokevirtual #70; 7: InvokeVirtual #70; Java/Lang/StringBuilder.toString :() Ljava/Lang/String;
M3
public class dataType {public void main (String args []) {DataType dt = neuer DataType (); = 128; }}Druckergebnisse
M31 Ergebnis TRUEM32 ERGEBNIS FALSCH
Warum gibt es eine erste und eine zweite falsche? Beachten Sie die von Javap analysierten Daten
Javap Parsing -Inhalt
Öffentliche Void M31 (); 2 12: Getstatic #53; Java/Lang/StringBuilder 18: DUP 19: LDC #88; #70; Lang/Integer Java/Lang/Integer 63; // Methode Java/Lang/StringBuilder. IF_ACMPNE 35 31: ICONST_1 32: GOTO 35: ICONST_0 36: Invokevirtual #66; InvokeVirtual #74;
M4
public class dataType {public void main (String args []) {DataType dt = neuer DataType (); 42 () {Integer a = Integer.Valueof (128); System.out.println ("M42 Ergebnis" + (a == b));Druckergebnisse
M41 Ergebnis TRUEM42 ERGEBNIS FALSCH
Javap Parsing -Inhalt
öffentliche void m41 (); 2 12: Getstatic #53; Java/Lang/StringBuilder 18: DUP 19: LDC #92; #70; Lang/Integer Java/Lang/Integer 63; // Methode Java/Lang/StringBuilder. IF_ACMPNE 35 31: ICONST_1 32: GOTO 35: ICONST_0 36: Invokevirtual #66; InvokeVirtual #74;
analysieren
Javap ist ein Tool mit Java.
Schauen wir uns zuerst M4 an.
Aber Objekt A wird durch Aufrufen von Integer.Valueof () generiert, und B ist ein Objekt, das durch automatisches Boxen erzeugt wird. Schauen wir uns den Bytecode noch einmal an.
Die M41 -Methode gilt nur einmal ValueOF (), erscheint jedoch zweimal im Bytecode, was bedeutet, dass ValueOF () auch während des automatischen Boxens aufgerufen wird.
Das Folgende ist die spezifische Implementierung von ValueOF ()
/** * Gibt eine Integerin </tt> -Instanz zurück, die den angegebenen Wert darstellt Ich an <Code> int </code> Wert. }
In Zahlen zwischen [-128, 127] gibt ValueOF ein Objekt im Cache zurück, sodass die beiden Aufrufe dasselbe Objekt zurückgeben.
Vielen Dank für das Lesen, ich hoffe, es kann Ihnen helfen.