Methode: Unterschied zwischen den Versionen

Aus EINI
Wechseln zu: Navigation, Suche
(Deklaration)
(Rückgabewert)
Zeile 49: Zeile 49:
 
In der '''Praxis''' möchte man in der [[Objektorientierte Programmierung|'''objektorientierten Programmierung''']] den Ablauf eines Programms so schnell wie möglich in einen an ein Objekt gebundenen, nicht-statischen Kontext überführen und, außer in Spezialfällen<ref>Verwendung von hilfreichen Funktionen, die keinen Objektzustand benötigen und keinen neuen erzeugen, wie z.B. mathematische Funktionen wie <code>cos</code>. Diese berechnen meist eine einfache Funktion und geben einen Wert zurück, ohne den Zustand des Programmes in irgendeiner Weise zu beeinflussen.</ref>, in diesem verbleiben.
 
In der '''Praxis''' möchte man in der [[Objektorientierte Programmierung|'''objektorientierten Programmierung''']] den Ablauf eines Programms so schnell wie möglich in einen an ein Objekt gebundenen, nicht-statischen Kontext überführen und, außer in Spezialfällen<ref>Verwendung von hilfreichen Funktionen, die keinen Objektzustand benötigen und keinen neuen erzeugen, wie z.B. mathematische Funktionen wie <code>cos</code>. Diese berechnen meist eine einfache Funktion und geben einen Wert zurück, ohne den Zustand des Programmes in irgendeiner Weise zu beeinflussen.</ref>, in diesem verbleiben.
  
= Rückgabewert =
+
= Rückgabe =
  
Der von einer Methode berechnete Wert wird als ihr '''zurückgegebener''' Wert bezeichnet. Der Programmfluss ''kehrt nach dem Aufruf der Methode mit ihrem Wert zurück'' in die Programmzeile, in der die Funktion aufgerufen wurde.
+
Der von einer Methode berechnete Wert wird als ihr '''zurückgegebener Wert''' bezeichnet. Der Programmfluss kehrt sozusagen nach dem Aufruf der Methode mit ihrem Wert in die Programmzeile zurück, in der sie aufgerufen wurde.
  
Sobald eine Methode einen anderen Rückgabetyp als [[void]] besitzt, muss die Methode auch einen Wert zurück geben, da ihr Aufruf einen Wert zurück liefern muss. Dies begründet sich aus der [[Algorithmus | Vollständigkeit eines Algorithmus]]es bzw. der totalität der berechneten Funktion. Insbesondere muss '''jeder''' Pfad durch eine Methode einen Wert zurück geben können. Dies kontrolliert bereits der Compiler während der Übersetzung des Programmes.
+
Im Quellcode wird das Ergebnis der Berechnung mit dem [[Schlüsselwort]] '''return''' (engl. ''zurückgeben/zurückkehren'') gekennzeichnet. Hinter dem Schlüsselwort wird der Term notiert, der das Ergebnis beschreiben soll.
  
Im Quellcode wird Ergebnis der Berechnung mit dem Schlüsselwort '''return''' (engl. ''zurückgeben'') gekennzeichnet. Hinter dem Schlüsselwort wird der Term notiert, der das Ergebnis beschreiben soll.
+
Egal auf welche Art und Weise eine Methode terminiert, als letzte Anweisung muss ein Wert zurückgegeben werden. Das heißt, die letzte Anweisung muss immer ein '''return''' sein. Ansonsten ist die Methode unvollständig und wird vom Compiler nicht akzeptiert.
  
Hat eine Methode den Rückgabetyp [[void]], so muss eine Methode kein '''return''' besitzen, da die Methode kein Ergebnis berechnet und damit eine Methode beim erreichen der letzten Anweisung implizit zurück kehrt. Jedoch kann mit einem einzelnem '''return''' als Anweisung die Ausführung einer Methode vor Erreichen der letzten Anweisung beendet werden und zum Aufrufer zurückkehren.
+
Die einzige Ausnahme hierzu sind Methoden mit dem '''Rückgabetyp''' [[void]]. Sie werden auch häufig als '''Prozeduren''' bezeichnet. Prozeduren berechnen keine Ergebnisse und müssen daher auch keine Werte zurückgeben. Mit einem einzelnen '''return''' als Anweisung kann die Ausführung der Methode jedoch vor Erreichen der letzten Anweisung beendet werden und zum Aufrufer zurückkehren.
  
== Beispiel ==
+
Ein Beispiel für eine Methode mit diesem Rückgabetyp ist die [[main]]-Methode.
  
<source lang="java>
+
== Beispiele ==
 +
 
 +
<source lang="java" title="Normale Rückgabe">
 
public int average(int x, int y){
 
public int average(int x, int y){
     return (x + y) / 2; // Gibt das Ergebnis zurück
+
     return (x + y) / 2; // Gibt das Ergebnis zurück.
 
}
 
}
 +
</source>
  
 +
 +
<source lang="java" title="Vorzeitiger Abbruch">
 
public void printIfPositive(int x){
 
public void printIfPositive(int x){
     if(x < 0) return; // Bricht die Ausführung ab, wenn x kleiner 0 ist
+
     if(x < 0) return; // Bricht die Ausführung der Prozedur vorzeitig ab, wenn x kleiner 0 ist.
 
     System.out.println(x);
 
     System.out.println(x);
 
}
 
}
 
</source>
 
</source>
 +
 +
=== Negativbeispiel ===
 +
 +
<source lang="java">
 +
/**
 +
* Soll zwei Zahlen miteinander dividieren,
 +
* solange der Nenner y ungleich 0 ist.
 +
*/
 +
public double div(int x, int y){
 +
    if(y != 0) return (double) x / (double) y;
 +
}
 +
</source>
 +
Hier liegt ein Syntaxfehler vor, da die Methode für den Fall ''y ist 0'' keinen Wert zurückgibt.
  
 
= Fußnoten =
 
= Fußnoten =
 
<references />
 
<references />

Version vom 21. März 2016, 00:19 Uhr

Eine Methode definiert ein (Teil-)Programm.

Unterscheidung Methode und Funktion

Üblicherweise wird eine Methode von einer Funktion unterschieden: Eine Methode wird auf einem Objekt ausgeführt, eine Funktion wird nach Belieben aufgerufen. Bei der Deklaration unterscheidet man zwischen Methode und Funktion nur durch den Modifikator static.

Eine Funktion wird im statischen Kontext der Klasse ausgeführt und hat daher nur Zugriff auf Klassenattribute und lokale Variablen, während eine Methode zusätzlich Zugriff auf Attribute der Objektinstanz hat.

Syntaxdiagramm

Method declaration.png

Deklaration

Eine (statische) Methode wird innerhalb des Klassenrumpfes mit Angabe der Modifikatoren (visibility und functional modifier), des Rückgabetyps (primitive type oder identifier) und des Namens (identifier) deklariert. Darauf folgen in runden Klammern die Parameter. Danach kommt der eigentliche Rumpf der Methode innerhalb von geschweiften Klammern in Form eines Blocks.

Wird der Modifikator abstract verwendet, so wird nur die Signatur der Methode, nicht aber ihr Rumpf angegeben. Die Deklaration wird mit einem Semikolon abgeschlossen.

Beispiele

private static int foo(int bar){
    // ... //
}

Dies ist eine private, statische Methode, die einen int berechnet, foo heißt und einen int namens bar als Parameter erwartet. Die Methode benötigt eine Implementierung, die hier aber nicht weiter relevant ist.

public abstract double bar(double foo);

Dies ist eine öffentliche, abstrakte Methode, die einen double berechnet, bar heißt und einen double namens foo als Parameter erwartet. Dem Methodenkopf folgt keine Implementierung, da sie als abstrakt deklariert ist und von einer erbenden Klasse implementiert werden soll.

Organisation

Funktionen und Methoden werden hauptsächlich deklariert, um den Quellcode zu strukturieren. Es bietet sich immer an, häufig verwendete Codefragmente als eigene Funktion auszulagern.

Die Funktionalität eines Objektes sollte durch seine verfügbaren Methoden repräsentiert werden. Diese Funktionalitäten sollten relativ einfach formulierbar sein (frei nach dem Motto "Do one thing, and do it well!"[1]). Meistens beinhalten diese insbesondere die Fähigkeit, Attribute des Objektes zu manipulieren oder in Abhängigkeit von diesen spezielle Aufgaben zu erfüllen.

Statisch vs. Nicht-Statisch

Ein Java-Programm beginnt immer in der main-Methode im statischen Kontext. Das heißt die Ausführung des Programms findet nicht innerhalb einer Instanz eines Objektes statt.

Wird auf einem Objekt eine Methode ausgeführt, wechselt das Programm in einen nicht-statischen Kontext, in dem die Ausführung des Programms abhängig vom Zustand des Objektes ist, auf dem die Methode ausgeführt wird.

Innerhalb einer Klasse selbst können aus einem statischen Kontext heraus keine nicht-statischen Methoden aufgerufen oder nicht-statische Attribute manipuliert werden; es ist kein Objekt vorhanden, dass dies machen könnte. Möchte man es trotzdem tun, so muss man aus dem statischen Kontext heraus eine Objektinstanz erstellen und auf dem erstellen Objekt die gewünschte Methode aufrufen. In den meisten Fällen ergibt das jedoch für den Ablauf des Programms keinen Sinn.

In der Praxis möchte man in der objektorientierten Programmierung den Ablauf eines Programms so schnell wie möglich in einen an ein Objekt gebundenen, nicht-statischen Kontext überführen und, außer in Spezialfällen[2], in diesem verbleiben.

Rückgabe

Der von einer Methode berechnete Wert wird als ihr zurückgegebener Wert bezeichnet. Der Programmfluss kehrt sozusagen nach dem Aufruf der Methode mit ihrem Wert in die Programmzeile zurück, in der sie aufgerufen wurde.

Im Quellcode wird das Ergebnis der Berechnung mit dem Schlüsselwort return (engl. zurückgeben/zurückkehren) gekennzeichnet. Hinter dem Schlüsselwort wird der Term notiert, der das Ergebnis beschreiben soll.

Egal auf welche Art und Weise eine Methode terminiert, als letzte Anweisung muss ein Wert zurückgegeben werden. Das heißt, die letzte Anweisung muss immer ein return sein. Ansonsten ist die Methode unvollständig und wird vom Compiler nicht akzeptiert.

Die einzige Ausnahme hierzu sind Methoden mit dem Rückgabetyp void. Sie werden auch häufig als Prozeduren bezeichnet. Prozeduren berechnen keine Ergebnisse und müssen daher auch keine Werte zurückgeben. Mit einem einzelnen return als Anweisung kann die Ausführung der Methode jedoch vor Erreichen der letzten Anweisung beendet werden und zum Aufrufer zurückkehren.

Ein Beispiel für eine Methode mit diesem Rückgabetyp ist die main-Methode.

Beispiele

public int average(int x, int y){
    return (x + y) / 2; // Gibt das Ergebnis zurück.
}


public void printIfPositive(int x){
    if(x < 0) return; // Bricht die Ausführung der Prozedur vorzeitig ab, wenn x kleiner 0 ist.
    System.out.println(x);
}

Negativbeispiel

/**
 * Soll zwei Zahlen miteinander dividieren,
 * solange der Nenner y ungleich 0 ist.
 */
public double div(int x, int y){
    if(y != 0) return (double) x / (double) y;
}

Hier liegt ein Syntaxfehler vor, da die Methode für den Fall y ist 0 keinen Wert zurückgibt.

Fußnoten

  1. Unix Philosophy
  2. Verwendung von hilfreichen Funktionen, die keinen Objektzustand benötigen und keinen neuen erzeugen, wie z.B. mathematische Funktionen wie cos. Diese berechnen meist eine einfache Funktion und geben einen Wert zurück, ohne den Zustand des Programmes in irgendeiner Weise zu beeinflussen.