Java

Objektorientiertes Programmieren II

Nun erklären wir dir in diesem Beitrag was eine Objektreferenz ist und wie man in Java mit ihnen programmiert.

Objektreferenzvariablen und Objekte in Java

Grundsätzlich betrachten wir beim Umgang mit Objekten in Java zwei Dinge: Objektreferenzvariablen und die Objekte, auf die sie verweisen. Im vorherigen Video haben wir uns schon mit Objekten beschäftigt. Jetzt wollen wir uns das noch genauer und sorgfältiger anschauen.

Wie du bestimmt weißt, bestehen alle Daten entweder aus primitiven Daten oder Objektdaten. Den einzigen Datentyp, den ein Programmierer definieren kann, ist ein Objektdatentyp, also eine Klasse. Denn ohne existierende Klassendefinition kann kein Objekt konstruiert werden.

Daten sind entweder primitive Daten oder Objektdaten

Während primitive Daten schon ein definiertes Speichersegment besitzen und automatisch den Speicher für die Daten reservieren, arbeiten Objektreferenzvariablen auf eine andere Weise.

Objekte sind groß, komplex und variieren im Umfang. Außerdem existiert ein Objekt nicht automatisch, wenn wir eine Objektreferenzvariable deklarieren. Denn alles, was bis dahin existiert, ist der Name für ein zukünftiges Objekt.

Die Objektreferenzvariable „str“

Aber wie sieht das nochmal aus?

Was wir hier machen, kommt dir bestimmt schon bekannt vor. Wir deklarieren eine Objektreferenzvariable namens „str“, die dem Stringobjekt angehört.

Objektreferenzvariable str

Erst durch die Nutzung des new-Operators existiert das Objekt und die Objektreferenzvariable erstellt eine Objektreferenz zu dem Stringobjekt, um einen Zugriff auf die Daten sowie die Methoden des Objekts zu bekommen. Die Objektreferenz sorgt dafür, dass Speicher für das Objekt reserviert werden kann.

Eine Objektreferenz ist eine Information darüber, wie ein bestimmtes Objekt gefunden werden kann, so wie eine Adresse. Da es sich bei dem Objekt nur um ein Stück Speicher im Arbeitsspeicher handelt, wird ein Weg benötigt, um dieses Stück Speicher aufrufen und verarbeiten zu können. Diesen Weg stellt die Referenz auf das Objekt dar.

Mit der Objektreferenzvariable findet man Objekte

Objektreferenz über den Zuweisungsoperator

Dabei ist der Zuweisungsoperator entscheidend, da er die Objektreferenz mittels zwei Schritten bildet. Zuerst wird der Ausdruck rechts des Zuweisungsoperators ausgewertet. Dadurch wird ein Objekt erzeugt, indem der Konstruktor verwendet wird. Danach wird das Ergebnis der Auswertung der Variablen links des Zuweisungsoperators zugewiesen, wodurch eine Referenz auf das Objekt in der Variablen „str“ gespeichert wird.

Diese Referenz ist ganz einfach aufrufbar. Zum Beispiel durch die „system out print line“-Anweisung.

Mit System out print line ist die Referenz aufrufbar

Dadurch wird die Referenz in „str“ verwendet, um das Objekt zu finden und die Daten auszugeben.

Aber Achtung! Es ist wichtig im Kopf zu behalten, dass eine Variable niemals ein Objekt enthält. Sie kann lediglich die Informationen darüber enthalten, wie das Objekt zu finden ist. Dadurch unterscheidet sich eine Referenzvariable von der primitiven Variable, da diese die eigentlichen Daten schon enthält.

Deshalb gibt es auch zwei Arten von Zuweisungsanweisungen.

Zuweisungsanweisung „=“

Bei primitiven Variablen enthält die Variable die aktuellen Daten und durch eine Zuweisungsanweisung „=“ werden die vorherigen Daten durch die neuen Daten ersetzt.

Zuweisungsanweisung „=“

Die Referenzvariable jedoch ersetzt durch eine Zuweisungsanweisung die alte Referenz – falls vorhanden – durch die neue Referenz.

Doch wie kann man diese beiden Arten von Variablen nun auseinanderhalten? Ganz einfach. Werfe immer einen Blick darauf, wie die Variable deklariert ist. Wenn sie nicht als primitiver Datentyp deklariert wurde, handelt es sich um eine Objektreferenzvariable. Denn eine Variable wird ihren deklarierten Typ nie ändern.

Im Verlauf des Beitrag werden wir „String str;“ nicht mehr verwenden. Du kannst also davon ausgehen, dass es sich bei „str“ immer um eine Referenzvariable des Stringobjekts handeln wird.

Schauen wir uns einmal an was passiert, wenn man eine Zuweisungsanweisung zwei Mal auf die gleiche Referenzvariable anwendet.

Doppelte Verwendung der Zuweisungsvariable

Zuerst erzeugen wir das erste Stringobjekt und speichern die Referenz auf das erste Objekt in „str“. Dann wird in der „system out print line“-Anweisung der Referenz in „str“ zu dem ersten Objekt gefolgt, um somit die Daten zu holen und auszugeben. Dann erzeugen wir ein zweites Objekt und speichern die Referenz auf das zweite Objekt im selben „str“. Ab dieser Stelle gibt es keine Referenz mehr auf das erste Objekt. Es ist jetzt Ausschuss. Zum Schluss wird der Referenz in „str“ zum zweiten Objekt gefolgt, um die Daten wieder zu holen und auszugeben. Auf dem Bildschirm sollte dann „Hello World!“ und „Hallo Welt!“ ausgegeben werden.

Die Objekte werden nun ausgegeben

Aber was ist eigentlich mit Ausschuss gemeint? Von Ausschuss spricht man, wenn Objekte existieren, auf die keine Referenzvariable mehr verweist. Auf diese Objekte hat man keinen Zugriff mehr, obwohl sie während der Programmlaufzeit immer noch existieren.

Dies nennt man auch Memoryleaks, also Speicherlücken, da sie Arbeitsspeicher verbrauchen ohne genutzt zu werden. Memoryleaks können in Programmiersprachen wie C++ zu einem großen Problem werden und die Performance des Programms beträchtlich beeinflussen.

Zum Glück besitzt das Java System den Speicherbereinigungsdienst, der sich um die verlorenen Objekte kümmert. So kann der Speicher, aus dem sie gemacht wurden, erneut verwendet werden.

Wie du siehst, steckt ziemlich viel hinter Referenzvariablen, auch wenn es auf den ersten Blick nicht so scheint.

Zuweisungsanweisung „==“

Aber was passiert eigentlich, wenn man die Gleichheit des Inhalts von Referenzvariablen prüfen möchte?

Wie wir es von primitiven Variablen kennen, können wir mittels des Gleichheitsoperators „==“ die Gleichheit der Daten innerhalb der Variablen prüfen.

So einfach ist das mit Referenzvariablen dann doch nicht. Schauen wir uns ein Beispiel dazu an:

Zuweisungsanweisung „==“

Wie du an der printline-Anweisung schon sehen kannst, wird der String nicht ausgegeben, da die if-Bedingung nicht erfüllt ist. Aber warum ist das so?

Wegen der nicht erfüllten if-Anweisung stimmen die Referenzen nicht überein

Da hier zwei unterschiedliche Objekte der selben Klasse erstellt worden sind, können die Referenzen nicht übereinstimmen.

Selbst wenn beide Stringobjekte „Hello World!“ als String enthalten, wird die if-Bedingung dennoch nicht erfüllt sein und die printline-Anweisung nicht ausgeführt werden. Dies liegt daran, dass es sich um zwei verschiedene Referenzen auf zwei verschiedene Objekte handelt.

Damit die Bedingung erfüllt werden kann, muss es sich um die gleiche Referenz handeln.

 

Die Stringobjekte weisen die gleiche Referenz auf

Aber Achtung, hierbei machen wir keine Kopie des Objekts! Das einzige was wir kopieren, ist die Referenz zu dem einen existierenden Objekt. Damit verweisen zwei Referenzvariablen auf das gleiche Objekt.

In diesem Beispiel verweisen wir die gleiche Referenz, die „strA“ besitzt, mittels Zuweisungsanweisung auf „strB“. Dadurch besitzen beide Referenzvariablen den gleichen Inhalt und die if-Bedingung ist erfüllt.

strA wird auf strB verwiesen

Falls du nun aber wirklich den Inhalt zweier Stringobjekte auf Gleichheit überprüfen willst, musst du das mittels einer Methode der Klasse String machen.

Dafür kannst du die equals-Methode benutzen, welche den String des Objekts, also den Inhalt und nicht die Referenz, mit einem anderen vergleicht. Da die equals-Methode einen boolean zurückgibt, können wir die Schreibweise so in der if-Bedingung stehen lassen.

equals-Methode

Super! Jetzt hast du auch das Prinzip der Referenzvariablen verstanden und kannst im Studium wieder voll durchstarten. Viel Erfolg!

Hallo, leider nutzt du einen AdBlocker.

Auf Studyflix bieten wir dir kostenlos hochwertige Bildung an. Dies können wir nur durch die Unterstützung unserer Werbepartner tun.

Schalte bitte deinen Adblocker für Studyflix aus oder füge uns zu deinen Ausnahmen hinzu. Das tut dir nicht weh und hilft uns weiter.

Danke!
Dein Studyflix-Team

Wenn du nicht weißt, wie du deinen Adblocker deaktivierst oder Studyflix zu den Ausnahmen hinzufügst, findest du hier eine kurze Anleitung. Bitte lade anschließend die Seite neu.