Heim  >  Artikel  >  Java  >  Was sind die Unterschiede zwischen Referenztypen und primitiven Typen in Java?

Was sind die Unterschiede zwischen Referenztypen und primitiven Typen in Java?

王林
王林nach vorne
2023-05-04 16:34:061585Durchsuche

Die folgende Tabelle listet primitive Typen und ihre Objekt-Wrapper-Klassen auf.

int i = 5; // 原始类型  Integer j = new Integer(10); // 对象引用
Beide Variablen werden in der lokalen Variablentabelle gespeichert, und beide sind es Java arbeitet mit dem Operandenstapel, stellt ihn jedoch völlig anders dar. (Im weiteren Verlauf dieses Artikels wird der Oberbegriff „Stack“ anstelle von „Operandenstapel“ oder „lokale Variablentabelle“ verwendet.) Der primitive Typ int und die Objektreferenz belegen jeweils 32 Bits des Stapels. (Um ein int oder eine Objektreferenz darzustellen, erfordert eine Java Virtual Machine-Implementierung die Verwendung von mindestens 32-Bit-Speicher.) Der Stapeleintrag für ein Integer-Objekt ist nicht das Objekt selbst, sondern eine Objektreferenz. Zum Beispiel können Methoden nicht für primitive Typen aufgerufen werden, Methoden können jedoch für Objekte aufgerufen werden:
int j = 5;  j.hashCode(); // 错误  //。..  Integer i = new Integer(5);  i.hashCode(); // 正确
import java.awt.Point;  class Assign  {  public static void main(String args[])  {  int a = 1;  int b = 2;  Point x = new Point(0,0);  Point y = new Point(1,1); //1  System.out.println(“a is ” + a);  System.out.println(“b is ” + b);  System.out.println(“x is ” + x);  System.out.println(“y is ” + y);  System.out.println(“Performing assignment and ” +  “setLocation.。.”);  a = b;  a++;  x = y; //2  x.setLocation(5,5); //3  System.out.println(“a is ”+a);  System.out.println(“b is ”+b);  System.out.println(“x is ”+x);  System.out.println(“y is ”+y);  }  }
a is 1  b is 2  x is java.awt.Point[x=0,y=0]  y is java.awt.Point[x=1,y=1]  Performing assignment and setLocation.。.  a is 3  b is 2  x is java.awt.Point[x=5,y=5]  y is java.awt.Point[x=5,y=5]
Die Ergebnisse der Änderung der ganzen Zahlen a und b sind nicht überraschend. Der Wert von b wird der ganzzahligen Variablen a zugewiesen, wodurch der Wert von a um 1 erhöht wird. Diese Ausgabe spiegelt wider, was passieren soll. Überraschend ist jedoch die Ausgabe der x- und y-Objekte nach der Zuweisung und dem Aufruf von setLocation. Wir haben setLocation speziell für x aufgerufen, nachdem wir die Zuweisung von x = y abgeschlossen haben. Wie können die Werte von x und y gleich sein? Schließlich haben wir x y zugewiesen und dann x geändert, was sich nicht von dem unterscheidet, was wir mit den ganzen Zahlen a und b gemacht haben.
x = y;
Die Situation, nachdem die Zuweisung bei //2 ausgeführt wurde, ist wie folgt:
Primitivtyp Verpackungsklasse
boolean Boolean
char Character
byte Byte
kurz Kurz
int Referenztypen und primitive Typen verhalten sich völlig unterschiedlich und haben eine unterschiedliche Semantik. Angenommen, es gibt zwei lokale Variablen in einer Methode, eine Variable ist vom primitiven Typ int und die andere Variable ist eine Objektreferenz auf ein Integer-Objekt:
Der Zugriff auf alle Objekte in Java erfolgt über Objektreferenzen. Eine Objektreferenz ist ein Zeiger auf einen Bereich im Heap, in dem das Objekt gespeichert ist. Wenn Sie einen primitiven Typ deklarieren, deklarieren Sie den Speicher für den Typ selbst.

Referenztypen und primitive Typen haben unterschiedliche Eigenschaften und Verwendungen. Dazu gehören: Größen- und Geschwindigkeitsprobleme, in welcher Art von Datenstruktur dieser Typ gespeichert wird, was passiert, wenn Referenztypen und primitive Typen als Instanzdaten einer angegebenen Klasse verwendet werden Standardwert. Der Standardwert für Objektreferenz-Instanzvariablen ist null, während der Standardwert für Instanzvariablen primitiven Typs von ihrem Typ abhängt.
Der Code vieler Programme enthält sowohl primitive Typen als auch deren Objekt-Wrapper. Bei der Prüfung, ob sie gleichwertig sind, wird es problematisch sein, mit beiden Typen zu arbeiten und zu verstehen, wie sie richtig interagieren und koexistieren. Programmierer müssen verstehen, wie diese beiden Typen funktionieren und interagieren, um Fehler in ihrem Code zu vermeiden.
Für die Verwendung primitiver Typen ist kein Aufruf von new oder das Erstellen eines Objekts erforderlich. Das spart Zeit und Platz. Auch das Mischen primitiver Typen und Objekte kann zu unerwarteten Ergebnissen im Zusammenhang mit der Zuweisung führen. Code, der fehlerfrei aussieht, erfüllt möglicherweise nicht die gewünschte Aufgabe. Zum Beispiel: Dieser Code generiert die folgende Ausgabe:
Diese Verwirrung wird durch die Verwendung primitiver Typen und Objekte verursacht. Die Zuweisung funktioniert bei beiden Typen nicht unterschiedlich. Aber es kann alles anders aussehen. Durch die Zuweisung wird der Wert auf der linken Seite des Gleichheitszeichens (=) gleich dem Wert auf der rechten Seite. Dies ist bei primitiven Typen wie int a und b früher offensichtlich. Bei nicht-primitiven Typen (z. B. Point-Objekten) ändert die Zuweisung die Objektreferenz, nicht das Objekt selbst. Daher ist x nach der Aussage gleich y. Mit anderen Worten: Da x und y Objektreferenzen sind, verweisen sie nun auf dasselbe Objekt. Daher ändert jede Änderung von x auch y. Folgendes ist die Situation, nachdem der Code bei //1 ausgeführt wurde:
Wenn setLocation bei //3 aufgerufen wird, wird diese Methode für das Objekt ausgeführt referenziert durch x. Weil das Point-Objekt von einem Objekt referenziert wird.

Es ist wichtig, zwischen Referenztypen und primitiven Typen zu unterscheiden und die Semantik von Referenzen zu verstehen. Andernfalls kann der zu schreibende Code seine beabsichtigte Aufgabe nicht erfüllen.

Das obige ist der detaillierte Inhalt vonWas sind die Unterschiede zwischen Referenztypen und primitiven Typen in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen