0% fanden dieses Dokument nützlich (0 Abstimmungen)
6 Ansichten10 Seiten

Method en

Hochgeladen von

elizabisalma04
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
6 Ansichten10 Seiten

Method en

Hochgeladen von

elizabisalma04
Copyright
© All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen

Methoden:

Methoden einer Klasse

In objektorientierten Programmen interagieren zur Laufzeit Objekte miteinander und senden


sich gegenseitig Nachrichten als Aufforderung, etwas zu machen.
Diese Aufforderungen resultieren in einem Methodenaufruf, in dem Anweisungen stehen, die
dann ausgeführt werden.
Das Angebot eines Objekts, also das, was es »kann«, wird in Java durch Methoden ausgedrückt.
Die Begriffe »Methode« und »Funktion« wollen wir hier gleichwertig benutzen.
Wir haben schon mindestens eine Methode kennen gelernt: println().
Sie ist eine Methode vom out-Objekt.
Ein anderes Programmstück schickt nun eine Nachricht an das out-Objekt, die println()-Methode
auszuführen.
Im Folgenden werden wir den aktiven Teil des Nachrichtenversendens nicht mehr so genau
betrachten, sondern wir sagen nur noch, dass eine Methode aufgerufen wird.
Zur Deklaration von Funktionen gibt es drei Gründe:
• Wiederkehrende Programmteile sollen nicht immer wieder programmiert, sondern an einer
Stelle angeboten werden. Änderungen an der Funktionalität lassen sich dann leichter
durchführen, wenn der Code lokal zusammengefasst ist.
• Komplexe Programme werden in kleine Teilprogramme zerlegt, damit die Komplexität des
Programms heruntergebrochen wird. Damit ist der Kontrollfluss leichter zu erkennen. In
klassischen Programmen heißen die Methoden daher auch Unterprogramme. Dieses Wort wollen
wir hier allerdings nicht benutzen.
• Die Operationen einer Klasse, also das Angebot eines Objekts, sind ein Grund für
Funktionsdeklarationen in einer objektorientierten Programmiersprache. Daneben gibt es aber
noch weitere Gründe, die für Methoden sprechen. Sie werden im Folgenden erläutert.

2.7.1 Bestandteil einer Funktion


Eine Funktion besteht aus mehreren Bestandteilen. Dazu gehören der Methodenkopf (kurz Kopf)
und der Methodenrumpf (kurz Rumpf).
Der Kopf besteht aus einem Rückgabetyp (auch Ergebnistyp genannt), dem Funktionsnamen
und einer optionalen Parameterliste.

Beispiel An der bekannten main()-Funktion lassen sich die


Bestandteile ablesen:
public static void main( String[] args )
{
[Link]( "Im Rumpf" );
}
Die Methode liefert keine Rückgabe, daher ist der »Rückgabetyp«
void. Der Funktionsname ist main und die Parameterliste String[] args.
Der Rumpf besteht nur aus der Bildschirmausgabe.

Signaturen einer Methode


Der Methodenname, die Parameter und die Typen der Parameter bestimmen die Signatur einer
Methode
– der Rückgabetyp gehört nicht dazu.
[Das ist in C(++) anders. Dort ist die Signatur einer Funktion auch durch den Rückgabetyp
definiert. ]
Pro Klasse darf es nur eine Methode mit derselben Signatur geben, sonst meldet der Compiler
einen Fehler.

Beispiel Die Funktionen

void main( String[] args )


und
String main( String[] argumete )
haben die Signatur (main, String[]). Der Compiler sieht sie als gleich an
und so können sie nicht zusammen in einer Klasse deklariert werden.
Die Namen der Parameter spielen keine Rolle.

2.7.3 Aufruf einer Methode


Da eine Funktion immer zu einer Klasse gehört, muss deutlich sein, zu wem die Methode gehört.
Im Fall von [Link]() ist println() eine Methode vom out-Objekt.
Wenn wir das Maximum zweier Gleitkommazahlen mit [Link](a, b) bilden, dann ist max() eine
Funktion der Klasse Math.
Für den Aufrufer ist damit immer ersichtlich, wer diese Methode anbietet, also auch, wer diese
Nachricht entgegennimmt.
Was der Aufrufer nicht sieht, ist die Arbeitsweise der Funktion.
Der Funktionsaufruf verzweigt in den Programmcode, aber der Aufrufer weiß nicht, was dort
geschieht. Er betrachtet nur das Ergebnis.
Die aufgerufene Funktion wird mit ihrem Namen genannt.
Die Parameterliste wird durch ein Klammerpaar umschlossen. Diese Klammern müssen auch
dann gesetzt werden, wenn die Methode keine Parameter enthält.
Eine Funktion wie [Link]() gibt nichts als Ergebnis einer Berechnung zurück.
Anders ist die Funktion max(); sie liefert ein Ergebnis. Damit ergeben sich vier unterschiedliche
Typen von Funktionen:

Tabelle
2.9 Funktionen mit
Rückgabewerten und
Parametern
Funktion Ohne Rückgabewert Mit Rückgabewert
ohne Parameter [Link]() [Link]
llis()
mit Parameter [Link](4) [Link](12, 33)

Die Methode [Link]() gibt die Anzahl der verstrichenen Millisekunden ab dem
1.1.1970 als long zurück.

2.7.4 Methoden ohne Parameter


Die einfachste Funktion besitzt keinen Rückgabewert und keine Parameter.
Der Funktionscode steht in geschweiften Klammern hinter den Kopf und bildet damit den Körper
der Methode.
Gibt eine Funktion nichts zurück, dann wird void vor dem Funktionsnamen geschrieben.
Falls die Funktion etwas zurückgibt, wird der Typ der Rückgabe anstelle von void geschrieben.
Beispiel Eine Funktion ohne Rückgabe und Parameter, die etwas auf
dem Bildschirm ausgibt.
Listing 2.15 [Link]
class SimpleFunction
{
static void output()
{
[Link]( "Toll hier im Java-Land" );
}

public static void main( String[] args )


{
output();
}
}

Am Aufruf der Funktion lässt sich ablesen, dass hier kein Objekt gefordert ist, das mit der
Methode verbunden werden soll.
Das ist möglich, denn die Funktion ist als static deklariert, und innerhalb der Klasse lassen sich
alle Funktionen einfach mit ihrem Namen nutzen.
2.7.5 Statische Funktionen (Klassenmethoden)

Leicht fällt das Schlüsselwort static unter den Tisch, denn static muss nicht zwingend vor der
Methodendeklaration stehen – sondern nur dann, wenn wir eine Methode aus einer anderen
statischen Funktion wie main() nutzen wollen.
Fehlt static, so erzeugt der Compiler etwa folgende Fehlermeldung: »non-static method …()
cannot be referenced from a static context«.
2.7.6 Parameter, Argument und Wertübergabe
Einer Funktion können Werte übergeben werden, die sie dann in ihre Arbeitsweise einbeziehen
kann.
Der Funktion println(2001) ist zum Beispiel ein Wert übergeben worden. Sie wird damit zur
parametrisierten Funktion.

Beispiel Werfen wir einen Blick auf die Funktionsdeklaration maxOut()


für Gleitkommazahlen. Die Methode soll später den größeren Wert auf
dem Bildschirm ausgeben.

static void maxOut( double a, double b )


{
// Hier kommt die Implementierung hinein.
}

Der Bezeichner, der innerhalb der Methode verwendet wird, um den übergebenen Wert
anzusprechen, heißt formaler Parameter.
a und b sind in unserem Beispiel die formalen Parameter. Sie werden durch ein Komma getrennt
aufgelistet.
Jeder Parameter muss mit seinem eigenen Typ aufgelistet werden. Mehrere Bezeichner dürfen
nicht den gleichen Namen tragen, andernfalls ergibt sich ein Übersetzungsfehler.
Wertübergabe: Call by value
Wenn eine Funktion aufgerufen wird, dann gibt es in Java ein bestimmtes Verfahren, in dem
jedes Argument einem Parameter übergeben wird. Diese Technik heißt im Allgemeinen
Parameterübergabemechanismus, und die meisten Programmiersprachen verfügen über eine
ganze Reihe von verwirrenden Möglichkeiten dazu.
Java kennt nur den Mechanismus der Wertübergabe (engl. call by value beziehungsweise auch
copy by value). Der in der Methode deklarierte Parameter wird als lokale Variable betrachtet, die
zum Zeitpunkt des Aufrufs mit dem Argument initialisiert ist. Das Ende des Blocks bedeutet dann
auch das Ende für die Parametervariable.

Beispiel Die Funktion maxOut() gibt die größere der beiden Zahlen aus:

static void maxOut( double a, double b )


{
{
if ( a > b )
[Link]( a );
else
[Link]( b );
}

Innerhalb des Funktionskörpers nutzen wir einfach die übergebenen Werte über die neuen
lokalen Variablen. Beim Aufruf der Methode kopiert die Laufzeitumgebung die Werte des
Arguments in die Variablen.

Beispiel Aufruf der Funktion maxOut():

int i = 2;
maxOut( 10, i );
Der Wert von 10 gelangt in die Variable a, und der Inhalt von i wird
ausgelesen und der Variable b in der Methode zugänglich gemacht.
Eine Typanpassung nimmt der Compiler automatisch vor, und die
beiden Ganzzahlen werden in double für die Funktion konvertiert.
Da der Wert der Variable übergeben wird, heißt das insbesondere, dass es keine
Übereinstimmung der Variablennamen geben muss.
Auswertung der Argumentenliste von links nach rechts
2.7.7 Methoden vorzeitig mit return beenden
Läuft eine Methode bis zum Ende durch, dann ist die Methode damit beendet, und es geht
zurück zum Aufrufer. In Abhängigkeit von einer Bedingung kann eine Methode jedoch vor dem
Ende des Ablaufs mit einer return-Anweisung beendet werden. Das ist nützlich bei Methoden,
die in Abhängigkeit von Parametern vorzeitig aussteigen wollen. Wir können uns vorstellen, dass
vor dem Ende der Funktion automatisch ein verstecktes return steht.

Beispiel Eine Methode soll die Wurzel einer Zahl auf dem Bildschirm
ausgeben. Bei Zahlen kleiner null erscheint eine Meldung, und die
Methode wird verlassen. Andernfalls wird die Wurzelberechnung
durchgeführt:
static void sqrt( double d )
{
if ( d < 0 )
{
[Link]( "Keine Wurzel aus negativen Zahlen!" );
return;
}
[Link]( [Link]( d ) );
}
Die Realisierung wäre auch mit einer else-Anweisung möglich
gewesen.
Eigene Methoden können natürlich wie Standardfunktionen heißen, da sie zu
unterschiedlichen Klassen gehören.

2.7.9 Rückgabewerte

Funktionen wie [Link]() liefern in Abhängigkeit von den Argumenten ein Ergebnis zurück.
Für den Aufrufer ist die Implementierung egal; er abstrahiert und nutzt lediglich die Methode
statt eines Ausdrucks.
Damit Funktionen Rückgabewerte an den Aufrufer liefern können, müssen zwei Dinge gelten:
• Eine Methode bekommt einen Rückgabetyp und nicht void.
• Sie enthält eine return-Anweisung, die einen geeigneten Wert zurückgibt.

Beispiel Eine Methode bildet den Mittelwert und gibt diesen zurück.

static double avg( double x, double y )


{
return (x + y) / 2;
}
Fehlt der Ausdruck und ist es nur ein einfaches return, meldet der Compiler einen
Programmfehler.
Der Rückgabewert muss an der Aufrufstelle jedoch nicht zwingend benutzt werden. Berechnet
unsere Methode jedoch den Durchschnitt zweier Zahlen, ist es unsinnig, den Rückgabewert nicht
zu verwenden.

2.7.10 Methoden überladen


Eine Funktion ist gekennzeichnet durch Rückgabewert, Name, Parameter und unter Umständen
durch Ausnahmefehler, die sie auslösen kann.
Java erlaubt es, den Namen der Funktion gleich zu lassen, aber andere Parameter einzusetzen.
Eine überladene Methode ist eine Funktion mit dem gleichen Namen wie eine andere Funktion,
aber einer unterschiedlichen Parameterliste.
Das ist auf zwei Arten möglich:
• Eine Funktion akzeptiert eine unterschiedliche Anzahl von Parametern.
• Eine Funktion lautet gleich, hat aber für den Compiler unterscheidbare Typen.

Beispiel Eine unterschiedliche Anzahl von Parametern ist eine sinnvolle


Angelegenheit. Die Funktion avg() könnten wir so für zwei und drei
Parameter deklarieren:

static double avg( double x, double y ) {


return (x + y) / 2;
}
static double avg( double x, double y, double z ) {
return (x + y + z) / 3;
}
2.7.11 Vorgegebener Wert für nicht aufgeführte Argumente
Überladene Funktionen lassen sich gut verwenden, wenn vorinitialisierte Werte bei nicht
vorhandenen Argumenten genutzt werden sollten.
Ist also ein Parameter nicht belegt, soll ein Standardwert eingesetzt werden. Um das zu
erreichen, überladen wir einfach die Funktion und rufen die andere Funktion mit dem
Standardwert passend auf.

Beispiel Zwei überladene Funktionen, mwst(double d, double satz) und


mwst(double d), sollen die Steuer berechnen. Wir möchten, dass der
Steuersatz automatisch 16 ist, wenn die Funktion mwst(double d)
aufgerufen wird und der Steuersatz nicht explizit gegeben ist; im
anderen Fall können wir den Satz beliebig wählen.

static double mwst( double d, double satz )


{
// Berechnung
}
static double mwst( double d )
{
return mwst( d, 16.0 );
}
2.7.13 Rekursive Funktionen

Wir wollen den Einstieg in die Rekursion mit einem kurzen Beispiel beginnen.

Beispiel Eine kleine Wunsch-Funktion:

static void fee()


{
wunsch();
wunsch();
fee();
}

Abbruch der Rekursion


Wir müssen nun die Fantasie-Programme (deren Laufzeit und Speicherbedarf auch sehr schwer
zu berechnen sind) gegen Java-Funktionen austauschen.

Beispiel Eine Endlos-Rekursion:


Listing 2.17 [Link], down()
static void down( int n )
{
[Link]( n + ", " );
down( n - 1 );
}
Rufen wir down(10) auf, dann wird die Zahl 10 auf dem Bildschirm ausgegeben und anschließend
down(9) aufgerufen.
Führen wir das Beispiel fort, so ergibt sich eine endlose Ausgabe, die so beginnt:
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, ...
An dieser Stelle erkennen wir, dass Rekursion prinzipiell etwas Unendliches ist. Für Programme
ist dies aber ungünstig. Wir müssen daher ähnlich wie bei Schleifen eine Abbruchbedingung
formulieren und dann keinen Rekursionsaufruf mehr starten.

Beispiel Die Abbruchbedingung einer Rekursion:

static void down( int n )


{
if ( n == 0 ) // Rekursionsende
return;
[Link]( n + ", " );
down( n - 1 );
}
Die down()-Methode ruft jetzt nur noch so lange down(n - 1) auf, wie
das n ungleich null ist.

Das könnte Ihnen auch gefallen