Objekte in Java
Wir haben bisher schon Ausdrücke behandelt, deren Typ ein Referenztyp ist. Solche Ausdrücke wurde von uns schon früher als Referenzausdrücke vorgestellt.
Wir haben gesehen, daß diese Ausdrücke Methoden enthalten, und daß man eine Methode eines Ausdrucks aufrufen kann, indem man einen Punkt ».« und einen Verbaufruf hinter den Ausdruck schreibt.
In dieser Lektion sollen jetzt die Werte von Referenzausdrücken behandelt werden.
Die Programmbeispiele dieser Lektion sind oft wie schon in früheren Lektionen behandelt, aber wir erlernen jetzt weitere Begriffe zu ihrer Beschreibung.
Objekte
Der Begriff „Objekt“ bezeichnet ein Element des Laufzeitmodells.
Ein Objekt ist ein Verzeichnis, das Einträge enthält, nämlich Variablen (die man auch Felder nennt) und Methoden.
Die Einträge eines Objekts nennen wir auch Objekteinträge. Im einzelnen nennen wir die Variablen eines Objektes auch Objektvariablen (Objektfelder ) und die Methoden eines Objektes Objektmethoden (im Gegensatz zu den statischen Methoden).
Der Wert eines Ausdrucks kann ein Objekt sein; in diesem Sinne werden Objekte im Quelltext durch Ausdrücke angegeben,
Jedes Objekt hat eine Klasse (als Typ). Die nicht-statische Methoden einer Klasse werden zu Methoden jedes Objekts der Klasse. Insofern kann man sagen: nicht-statische Methoden sind Objektmethoden.
Der Wert eines Referenzausdrucks ist ein normalerweise ein Objekt. (So wie eine int-Zahl normalerweise der Wert eines int-Ausdrucks ist.) Ein Referenzausdruck steht für ein Objekt.
Der Begriff „Objekt“ gehört zum Laufzeitmodell. Eingige andere Begriffe des Laufzeitmodells sind „Wert“, „Auswertung“, „Wirkung“ und „Ausführung“.
Sprechweisen für Objekte und ihre Ausdrücke
Ein Ausdruck, dessen Wert ein Objekt ist, nennt man auch manchmal einen Ausdruck für dieses Objekt (ein Ausdruck, der für jenes Objekt steht) oder eine Ausdruck dieses Objekts ; Umgekehrt nennen wird das Objekt dann das Objekt dieses Ausdrucks oder das hinter dem Ausdruck stehende Objekt (sozusagen unter der Schreibfläche).
Aufrufe von Objektmethoden
Wenn eine Methode eines Referenzausdrucks aufgerufen wird, dann führt der Referenzausdruck die Methode normalerweise aus, indem er den Aufruf an sein Objekt weiterleitet. Das Objekt enthält dann die Methode und erledigt damit die eigentliche Arbeit.
Der Wert eines Zeichenfolgenliterals, wie »"123"«, ist ein Objekt, das unter anderem eine parameterlose Methode mit dem Namen »length« enthält, welche die Anzahl der Zeichen des Zeichenfolgenliterals ergibt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String s = "abc";
java.lang.System.out.println( s.length() ); }}transcript
3
Im obenstehenden Programm wird die Methode »length()« des Ausdrucks »s« aufgerufen. Der Aufruf wird dann an das Objekt »"abc"« weitergeleitet. Jenes Objekt ergibt für den Aufruf »length()« den Wert »3«.
- Weiterleitung eines Aufrufs
length() ------> Ausdruck s ------> Objekt "abc"
<------ <------ Ergebnis 3
Man kann sich vorstellen, daß bei der Auswertung des Ausdrucks »s.length()« der Aufruf »length()« zuerst an den Ausdruck »s« geschickt wird. Da der Compiler bereits den Typ jenes Ausdrucks kennt, hatte er schon bei der Übersetzung geprüft, ob es im Typ jenes Ausdrucks, also in »java.lang.String«, überhaupt eine passende Methode gibt. Anschließend wird der Aufruf »length()« vom Ausdruck »s« an seinen Wert, also an das Objekt »"abc"« weitergeleitet. Das Objekt ermittelt dann das Ergebnis »3« und schickt dies an den Ausdruck »s« zurück, und schließlich ergibt sich so der Wert »3« als Wert des gesamten Ausdrucks »s.length()«.
Die Weiterleitung über einen Ausdruck findet aber auch ohne Variable statt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( "abc".length() ); }}transcript
3
- Weiterleitung eines Aufrufs
length() ------> Ausdruck "abc" ------> Objekt "abc"
<------ <------ Ergebnis 3
Weiterleitung
Wenn eine Methode eines Ausdrucks aufgerufen wird, dann wird der Aufruf zur Laufzeit an das Objekt weitergeleitet, welches hinter dem Ausdruck steht. Es muß also zur Laufzeit auch tatsächlich ein Objekt vorhanden sein, das hinter dem Ausdruck steht, um solch einen Aufruf auszuführen.
Redeweisen und Vorstellungen
Man nennt eine Methode, die mit einem Objekt als Wert des Kontext aufgerufen wird, auch eine Methode jenes Objektes.
Beispielsweise sagt man, daß in »java.lang.System.out.println()« die Methode »println()« des Objektes »java.lang.System.out« aufgerufen werde.
Wir stellen uns vor, daß eine Methode eines Objektes, in jenem Objekt enthalten ist.
In UML kann ein Objekt durch ein Rechteck dargestellt werden: In der obersten Abteilung jenes Rechteckes kann der Name des Objektes, gefolgt von einem Doppelpunkt »:« und dem Typ des Objekts unterstrichen angegeben werden. Darunter können dann die Signaturen im Objekt befindlicher Methoden aufgelistet werden.
- Ein Objekt mit Methoden (UML)
.--------------------------------------------.
| java.lang.System.out : java.io.PrintStream |
| ------------------------------------------ |
|--------------------------------------------|
| println() |
'--------------------------------------------'
Werte ⁺
Im Grundkurs hatten wir bereits einen Wert als „eine Zahl, eine Zeichenfolge oder einen Wahrheitswert“ definiert. Nun wird der Wertbegriff noch für Objekte erweitert.
Wir verstehen unter einem Wert eine Zahl, eine Zeichenfolge, einen Wahrheitswert oder ein Objekt.
Eine Zahl, eine Zeichenfolge, einen Wahrheitswert nennen wir auch einen elementaren Wert.
Übungsaufgaben ⃗
Hinweise zum Aufruf einer Methode eines Ausdrucks ←
Wir halten noch einmal fest, wie man eine Methode eines Ausdrucks aufruft: Man schreibt:
- den Ausdruck (in Klammern, falls er Operatoren enthält),
- einen Punkt ».« und
- einen Verbaufruf.
So kommt man zu einem Aufrufausdruck.
Hinweise zum Aufruf einer Methode eines Objektes ←
Um eine Methode eines Objektes aufzurufen, ruft man die Methode eines Ausdrucks für das Objekt auf, Man schreibt also:
- einen Ausdruck für das Objekt,
- einen Punkt ».« und
- einen Verbaufruf.
Hinweise zu Wirk- und Wertmethoden ←
Damit dieser Aufrufausdruck auch ausgewertet wird, muß er an eine geeigneten Stelle eines Programm eingesetzt werden. (Hier bei spielt es dann eine Rolle ob es sich einen Ausdruck mit oder ohne Wert handelt.) Bei der Aufgabe soll
- der Aufruf einer Wertmethode in die Klammern hinter »println« geschrieben und
- der Aufruf einer Wirkmethode als Anweisungsausdruck in eine Aufrufanweisung (vor ein Semikolon »;«)
geschrieben werden.
/ Übungsaufgabe ⃗
Rufen Sie die Methode »length()« des Objekts »"abcde"« ohne Deklaration einer Variablen direkt auf.
/ Übungsaufgabe ⃗
Rufen Sie die Methode »length()« des Objekts »"abcde"« auf, wobei der Bezeichner »o« als Kontext des Aufrufs verwendet wird.