Ein Befehl = Anweisung beschreibt, was in einem Programm geschehen soll.
Beispiel: Es soll etwas am Bildschirm ausgegeben werden: drucke
Eine Methode = Funktion = Unterrotine = Subrotine = Verhalten = Operationen
kann aus mehreren Anweisungen bestehen. Mehrere Anweisungen werden innerhalb
zweier geschwungenen Klammern zu einer Methode zusammengefasst.
Natürlich kann eine Tätigkeit nicht für sich alleine stehen.
Es muss, wie im wirklichen Leben jemand da sein, der die Tätigkeit ausführt.
Dieser jemand ist meist ein Objekt und, damit nicht nur wir, sondern auch das
Programm weiß, wer da was tun soll, wird das Objekt mit seinem Namen angesprochen.
Die Tätikeit wird durch einen Punkt getrennt anschließend angehängt.
Beispiel: Das Objekt heißt anton und soll drucken:
anton.drucke
Eine Anweisung erfolgt meistens mit bestimmten Daten. Damit das Programm im
Programmtext die Namen der Variablen von den Namen der Anweisungen unterscheiden
kann und die Daten = Parameter der Anweisung mitgegeben = übergeben werden
können, werden nach dem Namen der Anweisung zwei runde Klammern gesetzt.
Jeder Parameter wird durch einen Beistrich getrennt. Der Gültigkeitsbereich
dieser Parameter befindet sich immer nur innerhalb dieser runden Klammern. Daher
muss man den Typ der Variablen vor Nennung angeben:
anton.drucke(String myname, int myalter)
oder man übergibt gleich die Werte (= es wird kein neuer Speicher für
die Werteberechnung zugeteilt, da keine Zuweisung erfolgt):
anton.drucke("Roland", 41)
anton.drucke(new int[ ] { 1,2,3});
anton.drucke(myObject.getAttribut());
Die Übergabe der Werte der Parameter erfolgt in Java immer als Kopie!!
Damit können die Werte der Übergabeparameter nicht verändert werden! Das würde ja dem Prinzip der Kapselung widersprechen und unbeabsichtigte site-Effekte auslösen.
Der Inhalt der Variablen vom elementaren Typ, erfolgt in Java immer Kopie per
Value. Ist der Wert des Parameters eine Referenz, dann wird eine Kopie der Referenz
übergeben. Werden die Werte dieser Referenz verändert, dann betrifft
das natürlich alle Objekte, die ebenfalls dorthin referenzieren (Z.B.: Array!!).
Will man das verhindern, muss vor der Änderung eine entsprechende Kopie
erstellt werden!
Achtung: Die Übergabe des Wertes null, der für keine Referenz
auf ein Objekt steht, erzeugt immer einen Laufzeitfehler!
Die Methoden muss bei ihrem Aufruf genauso typisiert sein und der Anzahl der
Parameter und ihrem Typ des Rückgabewertes entsprechen, wie sie definiert
wurde (= Signatur einer Methode)! Werden Methoden gleichen Namens aber unterschiedlicher
Parameteranzahl und Typen definiert, wird die entsprechend signierte Methode
gleichen Namens gesucht und aufgerufen, wenn sie definiert wurde. Man kann daher
Methoden gleichnamig mit unterschiedlicher Parameteranzahl und Typen definieren
(Polymorphismus =ein Methodenname wird mehrfach für unterschiedliche,
hoffentlich sinnvolle, Implementierungen verwendet => Erspart langwierige
if - Abfragen!). Nicht möglich ist die Definition gleichnamiger Methoden
mit gleicher Parameterzahl und Typen aber unterschiedlicher Rückgabewerte.
Klassen verschiedenen Typs, können einen gemeinsamen Datentyp (= ein Objekt)
über ein gemeinsames Interface vereinbaren. Beispiel: siehe API:
java.awt.event
So wie in einer Sprache üblich werden mehrere Sätze, in diesem Fall
Anweisungen durch Trennzeichen, in diesem Fall einen Strichpunkt voneinander
getrennt. anton.drucke(name);
Die Idee in Schriften Zeichen zu trennen und damit die Wörter und Sätze
lesbar zu ordnen, stammt von den Römern!
Mehrere Anweisungen bilden eine Funktion. Sie werden durch geschwungene Klammern
zusammengefasst. Da Methoden ihrerseits durch Namen bezeichnet werden, gelten
dieselben Regeln wie bei Variablennamen. Die Typenbezeichnung legt bei Methodendeklaraton
fest von welchem Typ der Rückgabewert ist. Wird nichts zurückgegeben,
dann steht das Wort void vor dem Namen der Funktion. Diese Funktion kann keine
Return-Anweisung enthalten!!
Da Methoden auch außerhalb Ihres Namensraumes gültig sein können, wird der Bereich in der sie gültig sein dürfen vor der Angabe des Types bestimmt:
Damit kann eine Methode folgendermaßen aufgerufen werden.
Beispiel:
private void ausgeben(String myname,int myalter){
String name = myname; // Initialisierung der Variable und Übergabe des
Wertes
int myalter = alter;
anton.drucke(name); // 1. Anweisung
anton.drucke(telefon);
}
Wenn man die Funktion verwenden möchte, ruft man sie, natürlich mit
Namen mit:
berta.ausgeben("Roland", 41);
auf.
Die berta schafft daher dem anton an, dass er etwas ausgeben soll.
private void ausgeben(String myname,int myalter){
String name = myname;
int alter = myalter;
anton.drucke(name);
anton.drucke(telefon);
}
|
Die Variablen name und alter wurden innerhalb der Methode ausgeben definiert. Solche Variablen nennt man lokale Variablen. Lokale Variablen benötigen immer einen zugewiesenen definierten Anfangswert!
zusätzlich kann bei der Methodendeklaration bestimmt werden, ob:
Die objektorientierte Sichtweise sieht so aus:
a.methode(b) bedeutet:
a sendet eine Nachricht an b. Dazu muß man sich die Klasse von a ansehen:
class A{
public void methode(B b){
b.schleichDi();
// und erst JETZT reagiert b!!
}
}