it-swarm.com.de

Was ist der Unterschied zwischen einer Variablen, einem Objekt und einer Referenz?

Was genau sind die Unterschiede zwischen Variablen, Objekte und Referenzen?

Beispiel: Sie alle verweisen auf einen bestimmten Typ und müssen alle Werte enthalten (es sei denn, Sie haben den temporären Typ "nullfähig"). Aber wie unterscheiden sich ihre Funktionen und Implementierungen genau voneinander?

Beispiel:

Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12

Sie haben die gleichen Konzepte, aber wie unterscheiden sie sich?

68
user5217533

(Nur um klar zu sein, die Erklärung, die ich hier gebe, ist spezifisch für Java und C #. Gehen Sie nicht davon aus, dass sie auf andere Sprachen zutrifft, auch wenn Teile davon möglich sind.)

Ich mag es, jemandem zu sagen, wo ich wohne. Ich könnte meine Adresse auf ein Blatt Papier schreiben:

  • Eine Variable ist wie ein Stück Papier. Es hat einen Wert, aber es ist nicht der Wert an sich. Sie können alles streichen und stattdessen etwas anderes schreiben.
  • Die Adresse, die ich auf das Blatt Papier schreibe, ist wie eine Referenz. Es ist nicht mein Haus, aber es ist ein Weg zu meinem Haus zu navigieren .
  • Mein Haus selbst ist wie ein Objekt. Ich kann mehrere Verweise auf dasselbe Objekt ausgeben, aber es gibt nur ein Objekt.

Hilft das?

Der Unterschied zwischen einem Wertetyp und einem Referenztyp besteht darin, was auf das Blatt Papier geschrieben wird. Zum Beispiel hier:

int x = 12;

ist wie ein Stück Papier mit der Nummer 12 direkt darauf geschrieben zu haben. Wohingegen:

Dog myDog = new Dog();

schreibt den Inhalt des Dog-Objekts selbst nicht auf das Blatt Papier - es erstellt ein neues Dog und schreibt dann einen Verweis auf den Hund auf dieses Blatt Papier.

Nicht analog ausgedrückt:

  • Eine Variable repräsentiert einen Speicherort im Speicher. Es hat einen Namen, unter dem Sie zur Kompilierungszeit darauf verweisen können, und zur Ausführungszeit einen Wert, der immer mit dem Typ der Kompilierungszeit kompatibel ist. (Wenn Sie beispielsweise eine Variable Button haben, ist der Wert immer eine Referenz auf ein Objekt vom Typ Button oder eine Unterklasse - oder die Referenz null. )
  • Ein Objekt ist eine Art separate Einheit. Wichtig ist, dass der Wert einer Variablen oder eines Ausdrucks niemals ein Objekt ist, sondern nur eine Referenz. Ein Objekt besteht effektiv aus:
    • Felder (der Staat)
    • Eine Typreferenz (kann sich während der Lebensdauer des Objekts niemals ändern)
    • Ein Monitor (zur Synchronisation)
  • Eine Referenz ist ein Wert, der für den Zugriff auf ein Objekt verwendet wird - z. Um Methoden aufzurufen, auf Felder zuzugreifen usw. Sie navigieren normalerweise mit dem Operator . durch die Referenz. Wenn beispielsweise foo eine Person -Variable ist, nimmt foo.getAddress().getLength() den Wert von foo (eine Referenz) an und ruft getAddress() auf das Objekt, auf das sich dieser Verweis bezieht. Das Ergebnis könnte ein String Verweis sein ... Wir rufen dann getLength() für das Objekt auf, auf das sich dieser Verweis bezieht .
150
Jon Skeet

Ich benutze oft die folgende Analogie, wenn ich diese Konzepte erkläre.


Stellen Sie sich vor, ein Objekt ist ein Ballon. Eine Variable ist eine Person. Jede Person ist entweder im Werttyp Team oder im Referenztyp Team. Und alle spielen ein kleines Spiel mit folgenden Regeln:

Regeln für Werttypen:

  • Sie halten einen mit Luft gefüllten Ballon in den Armen. (Variablen vom Typ Wert speichern das Objekt.)
  • Sie müssen immer genau einen Ballon halten. (Werttypen sind nicht nullfähig.)
  • Wenn jemand anderes Ihren Ballon haben möchte, kann er seinen eigenen Ballon in die Luft jagen und ihn in den Armen halten. (Bei Werttypen wird das Objekt kopiert.)
  • Zwei Personen können nicht denselben Ballon halten. (Werttypen werden nicht geteilt.)
  • Wenn Sie einen anderen Ballon halten möchten, müssen Sie den Ballon, den Sie bereits halten, platzen lassen und einen anderen ergreifen. (Ein Werttypobjekt wird beim Ersetzen zerstört.)

Regeln für Referenztypen:

  • Sie können ein Stück Schnur halten, das zu einem mit Helium gefüllten Ballon führt. (Referenztypvariablen speichern eine Referenz auf das Objekt.)
  • Sie dürfen ein Stück Schnur oder gar keine Schnur halten. (Referenztypvariablen sind nullbar.)
  • Wenn jemand anderes Ihren Ballon haben möchte, kann er sein eigenes Stück Schnur bekommen und es an denselben Ballon binden, den Sie haben. (Bei Referenztypen wird die Referenz kopiert.)
  • Mehrere Personen können Schnurstücke halten, die alle zum gleichen Ballon führen. (Referenztypobjekte können gemeinsam genutzt werden.)
  • Solange noch mindestens eine Person die Schnur an einem bestimmten Ballon festhält, ist der Ballon sicher. (Ein Objekt vom Typ Referenz ist aktiv, solange es erreichbar ist.)
  • Wenn bei einem bestimmten Ballon irgendwann jeder loslässt, fliegt dieser Ballon davon und niemand kann ihn mehr erreichen. (Ein Objekt vom Typ Referenz kann irgendwann nicht mehr erreichbar sein.)
  • Zu einem späteren Zeitpunkt, bevor das Spiel endet, kann ein verlorener Ballon aufgrund des atmosphärischen Drucks von selbst platzen. (Nicht erreichbare Objekte sind für die Speicherbereinigung geeignet, was nicht deterministisch ist.)

Sie können es sich wie eine Beantwortung von Fragen vorstellen.

Ein Objekt ist ein Was ...
Es ist wie jedes physische Ding auf der Welt, ein "Ding", das an sich erkennbar ist und signifikante Eigenschaften hat, die sich von anderen "Dingen" unterscheiden. Wie Sie wissen, ist ein Hund ein Hund, weil er bellt, seinen Schwanz bewegt und einem Ball nachjagt, wenn Sie ihn werfen.

Eine Variable ist eine welche ...
Als würdest du deine eigenen Hände beobachten. Jeder ist eine Hand für sich. Sie haben Finger, Nägel und Knochen in der Haut, aber Sie wissen, dass eine Ihre linke und die andere die rechte Hand ist. Das heißt, Sie können zwei "Dinge" des gleichen Typs/der gleichen Art haben, aber jedes kann auf seine eigene Weise unterschiedlich sein, kann unterschiedliche Werte haben.

Eine Referenz ist ein wo ...
Wenn Sie sich zwei Häuser in einer Straße ansehen, obwohl sie über eine eigene Fassade verfügen, können Sie jedes über eine eindeutige Adresse erreichen In einem anderen Land können Sie die Adresse des Hauses angeben, da sie immer noch dort sind, wo Sie sie hinterlassen haben, auch wenn Sie sie nicht direkt angeben können.

Nun zur Programmierung, Beispiele in C++

class Person{...}
Person Ana = new Person(); //An object is an instance of a class(normally)

Das heißt, Ana ist eine Person, aber sie hat einzigartige Eigenschaften, die sie von einer anderen Person unterscheiden.

&Ana //This is a reference to Ana, that is to say, a "where" does the variable 
     //"Ana" is stored, wether or not you know it's value(s)

Ana selbst ist die Variable zum Speichern der Eigenschaften der Person mit dem Namen "Ana"

7
Edgar Sampere

Jons Antwort ist großartig, wenn man es von einer Analogie aus betrachtet. Wenn eine konkretere Formulierung für Sie nützlich ist, kann ich eingreifen.

Beginnen wir mit einer Variablen. Eine Variable ist ein [benanntes] Ding, das einen Wert enthält. Zum Beispiel definiert int x = 3 Eine Variable mit dem Namen x, die die ganze Zahl 3 enthält. Wenn ich ihr dann die Zuweisung x=4 Folge, enthält x jetzt die ganze Zahl 4. Das Entscheidende ist, dass Wir haben die Variable nicht ersetzt. Wir haben keine neue "Variable x, deren Wert jetzt 4 ist", wir haben lediglich den Wert von x durch einen neuen Wert ersetzt.

Gehen wir nun zu Objekten über. Objekte sind nützlich, weil Sie häufig eine "Sache" benötigen, auf die von vielen Stellen aus verwiesen werden kann. Wenn Sie beispielsweise ein Dokument in einem Editor geöffnet haben und es an den Drucker senden möchten, ist es hilfreich, nur ein Dokument zu haben, auf das sowohl vom Editor als auch vom Drucker verwiesen wird. Das erspart Ihnen, es öfter kopieren zu müssen, als Sie vielleicht möchten.

Da Sie es jedoch nicht mehrmals kopieren möchten, können wir ein Objekt nicht einfach in eine Variable einfügen. Variablen halten einen Wert fest. Wenn also zwei Variablen an einem Objekt festgehalten werden, müssen sie zwei Kopien anfertigen, eine für jede Variable. Referenzen sind die Vermittler, die dies lösen. Referenzen sind kleine, leicht kopierbare Werte, die in Variablen gespeichert werden können.

Wenn Sie also im Code Dog dog = new Dog() eingeben, erstellt der Operator new ein neues Dog-Objekt und gibt einen Verweis auf dieses Objekt zurück, damit es einer Variablen zugewiesen werden kann. Die Zuweisung gibt dann dog den Wert eines Verweises auf Ihr neu erstelltes Objekt.

6
Cort Ammon

new Dog () instanziiert ein Objekt Dog, dh es wird ein Speicher für das Objekt erstellt. Sie müssen auf die Variable zugreifen, um einige Vorgänge zu bearbeiten. Dafür benötigen Sie eine Referenz, die Dog myDog ist. Wenn Sie versuchen, das Objekt zu drucken, wird ein nicht lesbarer Wert ausgegeben, der nichts als die Adresse ist.

      myDog -------> new Dog().
3
Shriram