Aufrufnachrichten in Java (Aufrufnachrichten in Java), Lektion, page 723653
https://www.purl.org/stefan_ram/pub/nachrichten_in_java (permalink) is the canonical URI of this page.
Stefan Ram
Java-Kurs

Nachrichten in Java 

Mit Nachrichten lernen wir hier keine neue Möglichkeit der Programmiersprache Java  kennen, sondern nur eine neue Sprechweise  für gewisse Aufrufe.

Aufrufnachrichten

Bei der Auswertung eines Aufrufs, der einen Verbaufruf enthält, wird aus dem Verbaufruf eine Aufrufnachricht  gebildet.

Eine Aufrufnachricht  besteht aus dem Verb ihres Aufrufs und den Werten  der Argumentausdrücke, die wir auch die Argumentwerte  (oder einfach die Argumente ) der Aufrufnachricht nennen.

Aus dem Verbaufruf »println( 1 + 1 )« wird beispielsweise die Aufrufnachricht »println( 2 )« gebildet. (Eine Aufrufnachricht ähnelt der Inkarnation einer Methode, aber sie ist die Inkarnation eines Verbes  und nicht einer bestimmten Methode.)

Entsprechung einer Aufrufnachricht im Quelltext

java.lang.System.out . println( 1 + 1 )

'------------------' '--------------'
| |
| bestimmt die Aufrufnachricht
| println( 2 )
bestimmt das Ziel der
Aufrufnachricht (ihren Empfaenger)

Um eine Aufrufnachricht anzugeben, schreiben wir das Verb und eine eingeklammerte, kommagetrennte Liste von Werten.

Aufrufnachrichten sind Teile des Laufzeitgeschehens, keine Teile des Quelltextes. Obwohl die Angabe einer Aufrufnachricht wie ein Aufruf aussehen kann, ist eine Aufrufnachricht also kein Aufruf.

Die Versendung von Aufrufnachrichten

Bei der Auswertung eines Aufrufs aus einem Objektausdruck, einem Punkt ».« und einem Verbaufruf, wird die zum Verbausdruck gehörende Aufrufnachricht zunächst an den Ausdruck geschickt. Dieser Ausdruck wird daher auch als der Zielausdruck  des Verbaufrufs beziehungsweise der Aufrufnachricht bezeichnet.

Versand einer Aufrufnachricht

Quelltext: java.lang.System.out . println( 1 + 1 )

Laufzeit: java.lang.System.out <-- println( 2 )

Dieser Ausdruck sollte dann als Wert ein Objekt  haben. Die Aufrufnachricht wird dann an jenes Objekt weitergeleitet. Jenes Objekt bezeichnen wir auch als das Zielobjekt  der Aufrufnachricht.

Versand einer Aufrufnachricht

Zielobjekt Zielausdruck Nachricht

Laufzeit: java.lang.System.out <-- java.lang.System.out <-- println( 2 )

Das Objekt erhält die Aufrufnachricht und erfährt dadurch von ihrem Inhalt, also vom Verb und den Argumentwerten.

Das Objekt wird durch den Empfang der Aufrufnachricht aktiv und kann nun auf die Aufrufnachricht reagieren.

Das Objekt interpretiert die Aufrufnachricht, indem es ein bestimmtes Verhalten  zeigt.

Wie genau  ein bestimmtes Objekt auf eine Aufrufnachricht reagiert hängt vom Objekt und von der Aufrufnachricht ab. (Des weiteren kann es auch noch von der Ausführungsumgebung abhängen.)

Im allgemeinen wird ein Objekt die in ihm enthaltene Methoden aufrufen, die am besten zur Aufrufnachricht paßt.

Das Objekt hinter dem Ausdruck »java.lang.System.out« reagiert auf die Aufrufnachricht »println( 2 )« bespielsweise mit dem Aufrufe seiner Methode »print(int)« mit dem Argumentwert »2« und daher mit der Ausgabe des Zeichens »2«.

Antwortnachrichten

Ein Objekt kann auf eine Aufrufnachricht auch mit einer anderen Nachricht antworten, die wir dann als Antwortnachricht  bezeichnen. Eine Antwortnachricht besteht aus einem Wert (der ein elementarer Wert  oder ein Objekt  sein kann).

Die Antwortnachricht wird zum Wert des vollständigen Aufrufausdrucks. (Dieser vollständige Aufrufausdruck besteht aus dem Ausdruck für das Zielobjekt, einem Punkt ».« und einem Verbaufruf.)

In dem folgenden Programm ist der vollständige Aufrufausdruck beispielsweise »"abc".length()«. Bei der Auswertung jenes Ausdrucks wird die Aufrufnachricht »length()« an das Objekt »"abc"« geschickt. Das Objekt antwortet dann mit der Antwortnachricht »3«. Diese legt dann den Wert des gesamten Aufrufausdrucks »"abc".length()« fest, der alsdann ausgegeben wird.

Main.java

public final class Main
{ public static void main( final java.lang.String[] args )
{

java.lang.System.out.println( "abc".length() ); }}

transcript
3

Versendung einer Aufrufnachricht über  einen Ausdruck

Wir sagen auch: „Die Aufrufnachricht wird über  den Zielausdruck an das Zielobjekt  geschickt.“.

In dem folgenden Programm wird die Aufrufnachricht »length()« zweimal an das dasselbe Objekt »"abc"« geschickt: Einmal über den Ausdruck »"abc"« und einmal über den Ausdruck »s«.

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( "abc".length() );

java.lang.System.out.println( s.length() ); }}

transcript
3
3

Verschiedene  Ausdrücke können also für dasselbe  Objekt stehen.

Verschiedene Aufrufnachrichten eines einzigen Verbaufrufs ⃗

In dem folgenden Programm werden bei der Auswertung des Ausdrucks »java.lang.System.out.println( i )« im Laufe der Programmausführung zwei Aufrufnachrichten  gebildet und verschickt: »println( 0 )« und »println( 1 )«. Dabei gibt es im Programm nur einen Verbaufruf  »println( i )« (Teil des Quelltextes).

Der Empfang der Aufrufnachricht »println( 0 )« durch das Objekt »java.lang.System.out« führt dann zur Ausgabe des Zeichens »0« und eines Zeilenendes. Anschließend führt der Empfang der Aufrufnachricht »println( 1 )« durch dasselbe Objekt zur Ausgabe des Zeichens »1« und eines Zeilenendes.

Main.java

public final class Main
{

public static void m( final int i )
{ java.lang.System.out.println( i ); }

public static void main( final java.lang.String[] args )
{ m( 0 ); m( 1 ); }}

transcript
0
1

Dieses Programm illustriert den Unterschied zwischen Verbaufrufen  und Aufrufnachrichten : Im Quelltext  finden wir einen Verbaufruf  »println( i )«, im Laufe der Ausführung  werden aber zwei Aufrufnachrichten  gebildet: »println( 0 )« und »println( 1 )«.

Übungsfragen

?   Übungsfrage

Welche beiden Aufrufnachrichten (also Kombinationen von Verben und Werten) werden in dem folgendem Programm verschickt?

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int x = 2;
java.lang.System.out.println( "@ABCDEFGHIJKLMNOPQRS".codePointAt( 5 - x )); }}
transcript
67

Hinweise:

Die Methode »java.lang.String#codePointAt(int)« ergibt die Kennzahl  des Schriftzeichens an der angegebenen Position.

Jedes Schriftzeichen hat in Java  eine bestimmte Kennzahl. Die Kennzahlen von »@« ist beispielsweise »64«, die von »A« »65«, »B« »66«, »C« »67«, und so weiter.

Übungsaufgaben

/   Übungsaufgabe

Senden Sie dem Objekt »"5678901234"« die Aufrufnachricht »substring( 2, 3 )«. (Die Lösung sollte möglichst kurz sein, also nichts enthalten, das dafür nicht unbedingt benötigt wird. [Hierbei wird Leerraum aber nicht berücksichtigt.])

/   Übungsaufgabe

Senden Sie dem Objekt »"5678901234"« die Aufrufnachricht »substring( 2, 3 )« über den Ausdruck »o«.

Die Formulierung „über den Ausdruck »o«“ bedeutet, daß der Ausdruck »o« als Kontext verwendet werden soll.

/   Übungsaufgabe

Senden Sie dem Objekt »java.lang.System.out« die Aufrufnachricht »toString()« über den Ausdruck »o«.

Die Formulierung „über den Ausdruck »o«“ bedeutet, daß der Ausdruck »o« als Kontext verwendet werden soll.

/   Zusatzaufgabe *

Können Sie die Aufrufnachricht »substring( 2 )« während der Ausführung einmal an das Objekt »"abcd"« und dann noch einmal an das Objekt »"xyz"« senden, wobei in Ihrem Programm das Verb »substring« nur einmal  vorkommt?

Versendungen von Aufrufnachrichten an Klassen ⃗

Einen Aufruf einer statischen Methode einer Klasse interpretieren wir ebenfalls manchmal als das Versenden einer Aufrufnachricht, nämlich als Versendung einer Aufrufnachricht an eine Klasse. Diese Klasse bezeichnen wir in diesem Zusammenhang auch als Zielklasse.

Beispielsweise wird bei der Auswertung das Ausdrucks »java.lang.Math.random()« die Aufrufnachricht »random()« an die Klasse »java.lang.Math« geschickt.

Synchronizität von Aufrufnachrichten *

Wenn im Zuge der Auswertung eines Ausdrucks eine Aufrufnachricht an ein Objekt geschickt wird, dann ruht die Auswertung des Ausdrucks während der Verarbeitung der Aufrufnachricht durch den Empfänger, selbst wenn diese Verarbeitung der Aufrufnachricht längere Zeit in Anspruch nimmt. Erst wenn die Verarbeitung abgeschlossen ist (zu dem Zeitpunkt, zu dem gegebenenfalls eine Antwortnachricht verschickt wird), wird die Auswertung des Ausdrucks fortgesetzt. Man nennt dies auch eine synchrone  Verarbeitung der Aufrufnachricht oder eine synchrone Aufrufnachricht.

Im folgenden Programm wird beispielsweise die Aufrufnachricht »length()« an das Objekt »"abc"« verschickt. Die Multiplikation mit »2« erfolgt erst, wenn die Antwortnachricht »3« vorliegt. Anschließend wird die Aufrufnachricht »print( 6 )« an das Objekt »java.lang.System.out« geschickt. Die Ausführung der nächsten Anweisung »java.lang.System.out.println();« erfolgt erst, wenn die Ausgabe des Zeichens »6« abgeschlossen ist.

Main.java

public final class Main
{ public static void main( final java.lang.String[] args )
{

java.lang.System.out.print( 2 * "abc".length() );
java.lang.System.out.println(); }}

transcript
6

/   Beispielaufgabe

Senden Sie die Nachricht  »length()« an das Objekt »"abc"«!

Beispiellösung
java.lang.System.out.println( "abc".length() );
Beispiellösung
final java.lang.String s = "abc";
java.lang.System.out.println( s.length() );

/   Übungsaufgabe⃗

Der Ausdruck »java.util.logging.Logger.getLogger( "abc" )« hat als Wert ein Objekt. Senden Sie diesem Objekt die Nachricht »info( "def" )« einmal mit einer Variablen und einmal ohne. (Das heißt, eimal soll der angegebene Ausdruck am Anfang des Aufrufs stehen und einmal nur ein Variablenname.)

Bei dieser Aufgabe sollten Wertaufrufe (Aufrufe, die einen Wert haben) in runden Klammern hinter »java.lang.System.out.println« geschrieben werden, und Aufrufe ohne Wert direkt vor ein Semikolon »;«.

/   Übungsaufgabe (1) ⃗

Note to the instructor  ► Die Bearbeitung dieser Aufgabe sollte erst nach der Nachbesprechnung der vorigen Aufgabe erfolgen.

Deklarieren Sie eine Variable für das Objekt, welches sich als Wert des Aufrufs »java.util.TimeZone.getDefault()« ergibt.

Senden Sie diesem Objekt dann die Nachrichten »setID( "ghi" )« und »getID()« in dieser Reihenfolge.

Bei dieser Aufgabe sollten Wertaufrufe (Aufrufe, die einen Wert haben) in runden Klammern hinter »java.lang.System.out.println« geschrieben werden, und Aufrufe ohne Wert direkt vor ein Semikolon »;«.

Aussprachehinweis
zone zoʊn

/   Versenden von Nachrichten

Senden Sie die Nachricht »deleteCharAt(2)« an das Objekt »new java.lang.StringBuilder( "Pluto" )«, aber geben Sie dabei noch nichts aus. Erst dahinter soll dann noch eine weitere Ausgabeanweisung folgen, mit der jenes Objekt dann ausgegeben wird. (Hierfür wird eine Variable für das Objekt benötigt!)

(zusätzliche Hilfestellung: Es soll also insgesamt nur einmal  »new« verwendet werden und »deleteCharAt( 2 )« soll nicht  in den Klammern hinter »println« stehen.)

/   Übungsaufgabe (1)

Erzeugen Sie zwei neue Objekt der Klasse »java.lang.String« mit derselben Zeichenfolge, indem Sie jeweils einen Erzeugungsausdruck mit einem Zeichenfolgenliteral als Argument verwenden, und geben Sie die Antwort des einen Objektes auf eine Nachricht mit dem Verb »equals« und dem anderen Objekt als Argumentwert der Nachricht aus. Geben Sie dann noch den Wert eines Vergleichs der beiden Objekte mit »==« aus.

/   Übungsaufgabe (2)

Erzeugen Sie ein neues Objekt der Klasse »java.lang.NoSuchMethodException«, indem Sie einen Erzeugungsausdruck ohne Argumente verwenden, und geben Sie das neue Objekt mit Hilfe von »java.lang.System.out.println« aus.

Erzeugen Sie danach ein weiteres neues Objekt der Klasse »java.lang.RuntimeException«, indem Sie einen Erzeugungsausdruck verwenden, in welchem das im vorigen Absatz erzeugte Objekt als Argument verwendet wird, und geben Sie das zweite neue Objekt nun ebenfalls mit Hilfe von »java.lang.System.out.println« aus.

Das zweite Objekt enthält eine Methode »getCause()«, die ein Objekt zurückgibt. Senden Sie dem zweiten Objekt die Nachricht »getCause()« und geben Sie die Antwort aus. Um welches Objekt handelt es sich bei der Antwort vermutlich?

About this page, Impressum  |   Form for messages to the publisher regarding this page  |   "ram@zedat.fu-berlin.de" (without the quotation marks) is the email-address of Stefan Ram.   |   A link to the start page of Stefan Ram appears at the top of this page behind the text "Stefan Ram".)  |   Copyright 1998-2014 Stefan Ram, Berlin. All rights reserved. This page is a publication by Stefan Ram. relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723653 stefan_ram:723653 Aufrufnachrichten in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723653, slrprddef723653, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Copyright 1998-2014 Stefan Ram, Berlin. All rights reserved. This page is a publication by Stefan Ram.
https://www.purl.org/stefan_ram/pub/nachrichten_in_java