5.5 Referenzen und Werte 

Objektverweis
Mithilfe einer Zuweisung kann einem Objektverweis A ein gleichartiger Objektverweis B zugewiesen werden. Beachten Sie dabei allerdings, dass nicht das Objekt, sondern nur eine Referenz (der Objektverweis) zugewiesen wurde. Die Objektverweise A und B verweisen nach der Zuweisung auf dasselbe Objekt. Falls im weiteren Verlauf des Programms eine Veränderung über einen der beiden Objektverweise vorgenommen wird, hat dies Auswirkungen auf dasselbe Objekt.
Referenztyp
Bei der Übergabe von Parametern an eine Prozedur oder Funktion haben wir bereits ein ähnliches Verhalten kennengelernt. Wenn ein Parameter mit ByRef übergeben wurde, dann hatte eine Änderung Auswirkungen auf die Original-Variable. Dieser Vorgang wurde daher auch als Übergabe per Referenz bezeichnet.
Werttyp
Anders verhält es sich bekanntlich bei der Zuweisung einer Variablen eines Basis-Datentyps (z. B. Integer oder Double). Nach der Zuweisung einer Variablen A an eine Variable B haben zwar beide zunächst den gleichen Wert, es handelt sich aber um zwei verschiedene Variablen, die im weiteren Verlauf des Programms unabhängig voneinander agieren können. Bezüglich dieses Verhaltens spricht man auch von Referenztypen (Objekte) und Werttypen (Variablen der Basis-Datentypen).
Es folgt ein Beispielprogramm (Projekt ReferenzenWerte), das diesen Unterschied verdeutlicht. Die Definition der Klasse ähnelt derjenigen im vorherigen Projekt Konstruktor, daher muss sie hier nicht mehr gesondert dargestellt werden.
Public Class Form1 Private Sub cmdAnzeigen1_Click(...) Handles ... Dim vespa As New Fahrzeug("Moped", 50) Dim schwalbe As Fahrzeug schwalbe = vespa lblAnzeige.Text = vespa.ausgabe() & vbCrLf & schwalbe.ausgabe() vespa.beschleunigen(35) lblAnzeige.Text += vbCrLf & vbCrLf & vespa.ausgabe() & vbCrLf & schwalbe.ausgabe() End Sub Private Sub cmdAnzeigen2_Click(...) Handles ... Dim x As Integer = 12 Dim y As Integer y = x lblAnzeige.Text = "x: " & x & ", y: " & y x = 25 lblAnzeige.Text &= vbCrLf & vbCrLf & "x: " & x & ", y: " & y End Sub End Class
Listing 5.8 Projekt »ReferenzenWerte«, Teil 1
Zur Erläuterung:
- Nach der Erzeugung eines Objekts (mit New) und eines Objektverweises (ohne New) der Klasse Fahrzeug erfolgt die Zuweisung des Objekts zum zweiten Objektverweis.
- Damit sind schwalbe und vespa Verweise auf dasselbe Objekt. Wird vespa beschleunigt, so erfährt man auch über schwalbe diese Veränderung, siehe Abbildung 5.5.
Abbildung 5.5 Zwei Verweise auf ein Objekt
- Im Gegensatz dazu zeigt die Prozedur mit den beiden Integer-Variablen ein anderes Verhalten. Kurzfristig haben x und y den gleichen Wert. Nach einer Veränderung von x trifft dies nicht mehr zu, siehe Abbildung 5.6.
Abbildung 5.6 Zwei verschiedene Variablen
5.5.1 Objekte vergleichen 

Equals()
In diesem Zusammenhang ist auch die Methode Equals() der Basisklasse Object von Interesse. Diese Methode erbt jede Klasse, weil jede Klasse von der Basisklasse Object abgeleitet wird. Das Thema Vererbung wird im Abschnitt 5.7 noch vertieft.
Mithilfe der Methode Equals() können Sie feststellen, ob Objekte gleich sind. Gleichheit bedeutet:
- bei Referenztypen, dass beide auf dasselbe Objekt verweisen,
- bei Werttypen, dass sie den gleichen Wert haben.
In der folgenden Erweiterung des Projekts ReferenzenWerte werden zwei Objektverweise miteinander verglichen:
Public Class Form1 [...] Private Sub cmdAnzeigen3_Click(...) Handles ... Dim vespa As New Fahrzeug("Roller", 35) Dim schwalbe As New Fahrzeug("Roller", 35) If vespa.Equals(schwalbe) Then MessageBox.Show("1: Die beiden Objekt" & "verweise zeigen auf dasselbe Objekt") Else MessageBox.Show("1: Die beiden Objekt" & "verweise zeigen nicht auf dasselbe Objekt") End If vespa = schwalbe If vespa.Equals(schwalbe) Then MessageBox.Show("2: Die beiden Objekt" & "verweise zeigen auf dasselbe Objekt") Else MessageBox.Show("2: Die beiden Objekt" & "verweise zeigen nicht auf dasselbe Objekt") End If End Sub End Class
Listing 5.9 Projekt »ReferenzenWerte«, zwei Verweise vergleichen
Zur Erläuterung:
- Die beiden Objekte der Klasse Fahrzeug werden mit identischen Werten erzeugt.
- Auf das Objekt vespa wird die geerbte Methode Equals() angewendet. Als Parameter wird der Objektverweis auf das andere Objekt übergeben. Die beiden Objekte haben zwar die gleichen Werte, aber die Methode Equals() liefert dennoch False, da die Objektverweise nicht auf dasselbe Objekt verweisen.
- Anschließend erfolgt die Zuweisung vespa = schwalbe.
- Nun verweisen beide auf dasselbe Objekt. Equals() liefert True.
Überladen
Die Methode Equals() kann in einer abgeleiteten Klasse überladen werden. Damit ist sie mehrmals vorhanden. Sie kann nun auch dazu benutzt werden, um nach klassenspezifischen Merkmalen festzustellen, ob die Objekte gleich sind.
Zur Erläuterung dieses Verhaltens wird die Klasse Fahrzeug im Projekt ReferenzenWerte wie folgt ergänzt:
Public Class Fahrzeug [ ... ] Overloads Function Equals( ByVal x As Fahrzeug) As Boolean If bezeichnung = x.bezeichnung And geschwindigkeit = x.geschwindigkeit Then Equals = True Else Equals = False End If End Function End Class
Listing 5.10 Projekt »ReferenzenWerte«, Methode »Equals()«
Zur Erläuterung:
- Die Funktion liefert True, wenn die Werte der beiden Eigenschaften bezeichnung und geschwindigkeit gleich sind.
- Die Methode Equals() wird in dieser Klasse mithilfe des Schlüsselworts Overloads überladen, d. h. es gibt jetzt auch eine Methode Equals(), die als Parameter Objekte der Klasse Fahrzeug erfordert.
Das folgende Beispielprogramm (ebenfalls im Projekt ReferenzenWerte) verwendet die veränderte Klasse Fahrzeug:
Public Class Form1 [...] Private Sub cmdAnzeigen4_Click(...) Handles ... Dim vespa As New Fahrzeug("Roller", 35) Dim schwalbe As New Fahrzeug("Roller", 35) If vespa.Equals(schwalbe) Then MessageBox.Show("Die beiden Objekte" & " sind gleich") Else MessageBox.Show("Die beiden Objekte" & " sind nicht gleich") End If End Sub End Class
Listing 5.11 Projekt »ReferenzenWerte«, Nutzung der Methode »Equals()«
Zur Erläuterung:
- Beim Vergleich wird nun die eigene Methode Equals() der Klasse Fahrzeug aufgerufen.
- Es werden die Werte der Eigenschaften verglichen. Diese sind gleich, also liefert die Methode Equals() den Wert True.