JavaRush /Java-Blog /Random-DE /Referenzdatentypen in Java

Referenzdatentypen in Java

Veröffentlicht in der Gruppe Random-DE
Ohne Verständnis der Java-Syntax ist es unmöglich, ein ernsthafter Entwickler zu werden, daher lernen wir heute weiterhin die Syntax. In einem der vorherigen Artikel haben wir über primitive Variablen gesprochen, aber da es zwei Arten von Variablen gibt, werden wir heute über den zweiten Typ sprechen – Referenztypen in Java. Also, was ist es? Warum werden in Java Referenzdatentypen benötigt? Referenzdatentypen in Java - 1Stellen wir uns vor, wir hätten ein TV-Objekt mit einigen Eigenschaften, wie z. B. Kanalnummer, Lautstärke und Ein-Flag:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
Wie kann ein einfacher Typ wie , intdiese Daten speichern? Denken wir daran: Eine Variable inthat 4 Bytes. Aber im Inneren befinden sich zwei Variablen (4 Bytes + 4 Bytes) des gleichen Typs und auch boolean(+1 Byte)... Insgesamt - 4 bis 9, aber in der Regel werden in einem Objekt viel mehr Informationen gespeichert. Was zu tun ist? Sie können ein Objekt nicht in eine Variable einfügen. An diesem Punkt unserer Geschichte tauchen Referenzvariablen auf. Referenzvariablen speichern die Adresse des Speicherorts, an dem sich ein bestimmtes Objekt befindet. Das heißt, es handelt sich um eine „Visitenkarte“ mit einer Adresse, mit der wir unser Objekt im gemeinsamen Speicher finden und einige Manipulationen daran durchführen können. Eine Referenz auf ein beliebiges Objekt in Java ist eine Referenzvariable. So würde es mit unserem TV-Objekt aussehen:
TV telly = new TV();
Wir setzen eine Variable vom Typ TV mit einem Namen tellyauf einen Link zum erstellten Objekt vom Typ TV. Das heißt, die JVM reserviert Speicher auf dem Heap für das TV-Objekt, erstellt es und ordnet es seinem Speicherort zu, fügt es in die Variable ein telly, die auf dem Stapel gespeichert wird. In dieser Vorlesung können Sie mehr über den Speicher, insbesondere den Stapel, und viele andere nützliche Informationen lesen . Eine Variable vom Typ TV und ein Objekt vom Typ TV, ist Ihnen das aufgefallen? Das ist nicht ohne Grund: Objekte eines bestimmten Typs müssen entsprechende Variablen desselben Typs haben (Vererbung und Schnittstellenimplementierungen zählen nicht dazu, aber das berücksichtigen wir jetzt nicht). Schließlich schütten wir doch keine Suppe in Gläser, oder? Es stellt sich heraus, dass unser Objekt ein Fernseher ist und die Referenzvariable dafür wie ein Bedienfeld ist. Mit dieser Fernbedienung können wir mit unserem Objekt und seinen Daten interagieren. Stellen Sie beispielsweise die Eigenschaften für unseren Fernseher ein:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
Hier haben wir den Punktoperator verwendet, .um auf die internen Elemente des Objekts zuzugreifen und diese zu verwenden, auf das sich die Variable bezieht. In der ersten Zeile haben wir der Variablen beispielsweise gesagt telly: „Geben Sie uns eine interne Variable isOndes Objekts, auf das Sie verweisen, und setzen Sie sie auf true“ (schalten Sie für uns den Fernseher ein).

Referenzvariablen neu definieren

Nehmen wir an, wir haben zwei Variablen eines Referenztyps und die Objekte, auf die sie verweisen:
TV firstTV = new TV();
TV secondTV = new TV();
Wenn wir schreiben:
firstTV = secondTV;
Dies bedeutet, dass wir der ersten Variablen als Wert eine Kopie der Adresse (den Wert der Adressbits) dem zweiten Objekt zugewiesen haben und nun beide Variablen auf das zweite Objekt verweisen (mit anderen Worten, zwei Fernbedienungen für dasselbe). FERNSEHER). Gleichzeitig blieb das erste Objekt ohne eine Variable, die darauf verweist. Als Ergebnis haben wir ein Objekt, auf das nicht zugegriffen werden kann, weil die Variable für sie ein solcher bedingter Thread war, ohne den sie zu Müll wird, einfach im Speicher liegt und Platz beansprucht. Dieses Objekt wird anschließend vom Garbage Collector aus dem Speicher gelöscht . Referenzdatentypen in Java - 2Sie können den Verbindungsthread mit einem Objekt ohne weiteren Link unterbrechen:
secondTV = null;
Infolgedessen gibt es nur noch einen Link zum Objekt – firstTVund secondTVverweist auf niemanden mehr (was uns nicht daran hindert, ihm in Zukunft einen Link zu einem Objekt wie TV zuzuweisen).

String-Klasse

Separat möchte ich die String- Klasse erwähnen . Dies ist eine Basisklasse zum Speichern und Arbeiten mit Daten, die als Zeichenfolge gespeichert sind. Beispiel:
String text = new String("This TV is very loud");
Hier haben wir einen String übergeben, der im Konstruktor des Objekts gespeichert werden soll. Aber das macht niemand. Schließlich können Zeichenfolgen erstellt werden:
String text = "This TV is very loud";
Viel bequemer, oder? In Bezug auf die Beliebtheit seiner Verwendung Stringist es primitiven Typen nicht unterlegen, aber es ist immer noch eine Klasse, und die Variable, die darauf verweist, ist kein primitiver Typ, sondern ein Referenztyp. Wir Stringhaben diese wunderbare Fähigkeit, Zeichenfolgen zu verketten:
String text = "This TV" + " is very loud";
Als Ergebnis erhalten wir wieder den Text: This TV is very loud, da die beiden Zeilen zu einem Ganzen zusammengefasst werden und die Variable auf diesen Volltext verweist. Eine wichtige Nuance ist, dass Stringes sich um eine unveränderliche Klasse handelt. Was bedeutet das? Nehmen wir dieses Beispiel:
String text = "This TV";
text = text + " is very loud";
Es scheint, dass alles einfach ist: Wir deklarieren eine Variable und geben ihr einen Wert. In der nächsten Zeile ändern wir es. Aber wir ändern uns nicht wirklich. Da es sich um eine unveränderliche Klasse handelt, wird in der zweiten Zeile nicht der Anfangswert geändert, sondern ein neuer erstellt, der wiederum aus dem ersten besteht + " is very loud".

Referenzkonstanten

Im Artikel über primitive Typen haben wir das Thema Konstanten angesprochen. Wie verhält sich eine Referenzvariable, wenn wir sie als endgültig deklarieren ?
final TV telly = new TV();
Sie könnten denken, dass das Objekt dadurch unveränderlich wird. Aber nein, das stimmt nicht. Referenzdatentypen in Java - 3Eine Referenzvariable mit einem Modifikator finalwird an ein bestimmtes Objekt gebunden, ohne dass die Möglichkeit besteht, die Bindung auf irgendeine Weise aufzuheben (neu zu definieren oder mit gleichzusetzen null). Das heißt, nachdem der Wert einer solchen Variablen festgelegt wurde, folgt ein Code wie:
telly = new TV();
oder
telly = null;
führt zu einem Kompilierungsfehler. Das heißt, finales wirkt sich nur auf den Link aus und hat keine Auswirkungen auf das Objekt selbst. Wenn wir es zunächst veränderbar haben, können wir seinen internen Zustand problemlos ändern:
telly.soundVolume = 30;
Manchmal werden Variablen sogar in Methodenargumenten als final bezeichnet!
public void enableTV (final TV telly){
   telly.isOn = true;
}
Dies geschieht, damit diese Argumente beim Schreiben einer Methode nicht überschrieben werden können und somit weniger Verwirrung stiften. Was wäre, wenn wir finaleine Referenzvariable bezeichnen würden, die auf ein unveränderliches Objekt verweist? Z.B String:
final String PASSWORD = "password";
Als Ergebnis erhalten wir eine Konstante, ein Analogon von Konstanten eines primitiven Typs, da wir hier weder die Referenz neu definieren noch den internen Zustand des Objekts (interne Daten) ändern können.

Fassen wir es zusammen

  1. Während einfache Variablen Wertbits speichern, speichern Referenzvariablen Bits, die darstellen, wie ein Objekt abgerufen wird.
  2. Objektreferenzen werden nur für einen Objekttyp deklariert.
  3. Jede Klasse in Java ist ein Referenztyp.
  4. Der Standardwert jeder Referenzvariablen in Java ist null.
  5. Stringist ein Standardbeispiel für einen Referenztyp. Diese Klasse ist auch unveränderlich.
  6. Referenzvariablen mit einem Modifikator finalsind nur an ein Objekt gebunden, ohne dass eine Neudefinition möglich ist.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION