Das magische Schlüsselwort in Java „this“

Für den Anfang möchte ich ein das Schlüsselwort this und deren Funktionen kurz zusammenfassen.

Bevor wir uns Gedanken über das Schlüsselwort this machen, möchte ich mit euch das new Operator kurz wiederholen. Wir werden nämlich bei der Begriffserklärung für das Schlüsselbegriff this den new Operator brauchen müssen. Dazu benötigen wir eine Klasse mit denen wir unser Experiment beginnen werden. Die Klasse heißt Kraftfahrzeug. Es ist der Klassiker unter Begriffserklärungen von this.

public class Kraftfahrzeug {
public int ps = 0;
private int verbrauch = 0;
private int geschwindigkeit = 0;
}

Unsere Klasse enthält zwei privaten Attribute verbrauch, Geschwindigkeit und ein, was in der Praxis sehr sehr selten vorkommt, öffentliches Attribut ps. Unser nächster Schritt wäre, die Klasse Kraftfahrzeug mit Instanzen aufzurufen. Dies geht wie folgt:

Kraftfahrzeug fahrzeug1 = new Kraftfahrzeug();
Kraftfahrzeug fahrzeug2 = new Kraftfahrzeug();

Der new Operator sorgt dafür, dass Speicher für die erzeugenden Objekte reserviert wird. Nach den beiden Anweisungen haben wir also zwei Speicherbereiche, in denen wir jeweils Platz für die Kraftfahrzeug Attribute ps, verbrauch und Geschwindigkeit haben.

System.out.println(fahrzeug1);
System.out.println(fahrzeug2);

Als Ausgabe erhalten wir jedoch auf der Konsole folgendes:

Kraftfahrzeug@2a139a55
Kraftfahrzeug@15db9742

Als ersten würden wir uns wie in der Grundschule die W-Fragen durch den Kopf gehen lassen. Was ist passiert und wie ist es passiert.
Das was wir hier sehen nennt man Referenz. Eine Referenz kann man sich vorstellen wie eine Adresse, unter der wir den für ein Objekt reservierten Speicherbereich finden.

ALSO MERKE: WENN WIR OBJEKTE EINER VARIABLEN ZUWEISEN, DANN WEISEN WIR DER VARIABLE NICHT DEN INHALT DES OBJEKTES ZU, SONDERN LEDIGLICH EINEN VERWEIS AUF DIE POSITION IM SPEICHER, AN DER ES GESPEICHERT WURDE.

Schauen wir uns zunächst ein Beispiel an:

Kraftfahrzeug fahrzeug3 = fahrzeug1;
fahrzeug3.ps = 120;
fahrzeug1.ps = 160;
System.out.println(fahrzeug3.ps);
System.out.println(fahrzeug1.ps);

Womöglich rechnet der eine oder andere mit der Ausgabe:

120
160

Jedoch muss ich diejenigen enttäuschen. Wir werden tatsächlich die folgende Ausgabe in der Konsole erhalten:

160
160

Nun warum ist das passiert? Wo lagen wir Falsch?
Wir haben, wie ihr das im Quelldatei sehen könnt, für fahrzeug3 keine neue Instanz mittels des new Operators erzeugt und somit auch keinen Speicher reserviert sondern lediglich fahrzeug1 der Variablen fahrzeug3 zugewiesen. Also auf deutsch: Egal was wir für fahrzeug3 speichern wir weisen am Ende fahrzeug3 zu fahrzeug1. Das bedeutet, dass wir alle Werte für fahrzeug3 einsetzten können doch ihr Wert wird von der fahrzeug1 immer überschrieben werden, weil wir für fahrzeug3 keine separaten Speicherplatz zur Verfügung gestellt haben. Deshalb setzen wir zwar in der Zeile zwei, das ps Attribut auf 120, da wir in der Zeile drei aber den gleichen Speicherbereich ansprechen, wird dieser Wert sofort mit dem Wert 160 überschrieben.

Anwendungen des Java Schlüsselwort this:

Das Wort this wird in der Programmiersprache Java hauptsächlich beim lösen von Namenskonflikten angewendet. Als erstes möchte ich deshalb mit euch ein Beispiel durchgehen mit dem diese nicht Funktioniert also in diesem Fall der Compiler Fehlermeldung liefern würde.

public void setGeschwindigkeit(int geschwindigkeit) {
geschwindigkeit = geschwindigkeit;
}

In der zweiten Zeile gibt es aber noch ein Attribut mit der gleichen Namen Geschwindigkeit. Nun was ist was? Wir haben zwei Variablen vom Typ int jedoch sind diese unnötigerweise verglichen.
Falsch in der zweiten Zeile befindet sich die Variable Geschwindigkeit und das Attribut Geschwindigkeit. Welches ist aber was? Um dies zu unterscheiden, hilft uns das Magische Wort this. Mit diesem Wort können wir nämlich unterscheiden welches ein Attribut und welches eine Variable ist. Richtig wäre also:

public void setGeschwindigkeit(int geschwindigkeit) {
this.geschwindigkeit = geschwindigkeit;
}

Jetzt wird der Wert des Übergabeparameters Geschwindigkeit dem Attribut Geschwindigkeit zugewiesen.


Das war die Grobe Erläuterung des Befehls/Schlüsselwortes this. In den nächsten Tagen werden wir ein Beispiel über das Schlüsselwort this durchgehen.

Kommentare

Beliebte Posts aus diesem Blog

How can I transform a .jar file to a .bat file?

Ein Kleines Spiel mit Altersabfrage

Raspberry Pi als echten Web- und Mailserver einsetzen (German)