Objekte bestehen aus Attributen und Methoden. Attribute sind nur Variablen und Konstanten, die Werte aufnehmen können, und beschreiben damit den Zustand des Objektes. Im Gegensatz dazu gibt es die „Methoden“, die das dynamische Verhalten des Objektes oder einer Klasse definieren. Sie enthalten die Algorithmen eines Objektes.
Methoden sind in der objektorientierten Programmierung Unterprogramme, die das Verhalten von Objekten beschreiben und implementieren. Durch Methoden des Objekts können andere Objekte mit diesem Objekt über Nachrichten in Verbindung treten.
Neben der Bindung einer Methode an ein Objekt (also der Instanz einer Klasse), gibt die Möglichkeit Methoden direkt ohne Instanzen auszuführen. Solchen Methoden nennt man statisch (static).
Eine Methode muss im Körper einer Klasse stehen und besteht aus einem Kopf und einem Körper. Der Kopf besteht aus der Sichtbarkeit und einer Signatur. Die Signatur besteht aus einem Rückgabeparameter, dem Methodennamen und Eingabeparametern. Die Reihenfolge dieser Elemente ist für den Compiler entscheidend.
Der Kopf einer Methode besteht aus der Sichtbarkeit und der Signatur.
Sichtbarkeit
Die Sichtbarkeit gibt an, wer auf die Methode zugreifen darf.
private
Die Sichtbarkeit private besagt, dass nur innerhalb einer Klasse bzw. Instanz auf eine Methode zugegriffen werden darf.
public
Die Sichtbarkeit public macht die Methode öffentlich zugänglich. Hier gibt es keine Einschränkung.
protected
Die Sichtbarkeit protected ermöglicht den Zugriff innerhalb der Klasse selbst, aller Klassen eines Packages (in BlueJ Projekt) und ihrer erbenden Kinderklassen.
default
Wird keine Angabe zur Sichtbarkeit gemacht, können alle Klassen eines Packages (in BlueJ Projekt) zugreifen.
Signatur
Eine Signatur (oder Methodensignatur) definiert in der Programmierung die Schnittstelle einer Methode. Sie besteht aus dem Typ des Rückgabewerts, dem Namen der Methode und der Anzahl und Reihenfolge der Eingabeparameter.
Rückgabeparameter
Der Rückgabeparameter definiert den (Daten)-Typen möglicher Ergebnisse dieser Methode. Das Ergebnis wird aus dem Körper der Methode mittels eines return-Befehls (return) zurückgegeben. Möglich sind primitive Datentypen wie Integer, Double oder Boolean aber auch komplexe Datentypen. Komplexe Datentypen könne ein beliebige Klassen sein wie z.B. Mitarbeiter.
Soll ein Methode kein Ergebnis liefern muss das Schlüsselwort void geschrieben werden.
Methodenname
Der Methodenname ist freiwählbar. In der objektorientierten Softwareentwicklung ist es üblich Methodennamen mit einem Verb zu benennen. Hierdurch wird deutlich, dass die Methode Verhalten repräsentiert. So ist der Quelltext leichter zu lesen und zu verstehen.
Eingabeparameter
Um eine Methode flexibel und wiederverwendbar zu gestalten, können von außen Werte an Variablen übergeben werden. Diese Variablen nennt man Eingabeparameter. Möglich sind 0 bis N Variablen. Jede Variable muss deklariert werden; benötigt also einen Datentyp und einen Namen. Die einzelnen Variablen werden durch Kommas getrennt. Die gesamte Eingabeparameterliste wird in runde Klammern geschrieben (), egal ob sie null oder n Parameter enthält. Wie beim Rückgabeparameter können primitive und komplexe Datentypen vergeben werden.
Der Körper einer Methode folgt auf den Kopf und wird in geschweiften Klammern geschrieben {}. Im Körper - also innerhalb der geschweiften Klammern - kann ein beliebiger Algorithmus stehen. Wurde in der Signatur ein Rückgabeparameter definiert (also nicht void), dann muss in jedem Fall ein zum Datentyp des Rückgabeparameters kompatible Rückgabe erfolgen. Die Rückgabe wird im Körper durch das Schlüsselwort return kenntlich gemacht.
Der Algorithmus einer Methoden wird durch Kontrollstrukturen, Ausdrücke und Operanden befiniert.
Methoden, die nur einen Wert einer Instanzvariablen setzen bezeichnet man auch als verändernde Methoden (englisch auch setter-Methode).
Methoden, die nur einen Wert einer Instanzvariablen zurückliefern, bezeichnet man auch als sondierende Methoden (englisch auch getter-Methode).
Neben diesen beiden Kategorien gibt es beliebige Methoden und komplexen Algorithmen.
Verändernde Methoden werden auch setter-Methoden genannt. Ihre Aufgabe ist es, einen Wert einer Instanzvariable zu setzen. Im Rahmen der Deklaration von Instanzvariablen, haben sich gewisse Standards etabliert. Die Sichtbarkeit von Instanzvariablen sollte als "private" gewählt werden. So wird sichergestellt, dass Daten nicht ungefiltert in die Instanzvariable hineingeschrieben und gelesen werden können.
So kann es sinnvoll sein, dass Rechnungsbeträge nur durch positive Gleitkommazahlen abgebildet werden sollen. Wählt man den Datentyp double, ist das Speichern von negativen Werten nach wie vor möglich. Eine valide Postleitzahl wiederum besteht stets aus fünf Ziffern. Das Passwort eines Mitarbeiters soll mindestens aus sechs Zeichen bestehen und mindestens eine Ziffer beinhalten. Diese Auswahl an Beispielen zeigt, dass ein Mechanismus benötigt wird, der sicherstellt, dass die Wertzuweisung von Instanzvariablen einer Qualitätskontrolle unterzogen wird.
Beispiel einfache verändernde Methode
Kann jeder Wert in z.B. eine Instanzvariable geschrieben werden reicht folgende setter-Methode aus:
public void setName(String einName){
name = einName;
}
Diese Methode ist öffentlich zugänglich (public). Sie liefert kein Ergebnis (void). Daher darf auch im Körper der Methode kein return-Befehl stehen. Der Name der Methode lautet setName. Set steht für setzen und ist ein Verb. Die Eingabeparameter stehen in runden Klammern(). Hier gibt es eine Eingabe. Der Datentyp ist String und der Name des Eingabeparameters lautet einName. Der Wert von einName wird an die Instanzvariable name übergeben.
Beispiel verändernde Methode mit Filter
Rechnungsbeträge sollen nur positive Werte speichern dürfen.
public void setRechnungsbetrag (double einRechnungsbetrag){
if (einRechnungsbetrag>=0){
rechnungsbetrag = einRechnungsbetrag;
}
}
Private Attribute verhindern den Zugriff von außen. Das Auslesen von Werten wird durch sondierende Methoden ermöglicht. Die folgende Methode String getName() ist eine sondierende Methode für die Instanzvariable Name.
public String getName(){
return name;
}
Diese Methode ist öffentlich zugänglich (public). Sie liefert ein Ergebnis vom Typ String. Daher muss auch im Körper der Methode ein return-Befehl stehen. Der Name der Methode lautet "getName". Get steht für gib und ist ein Verb. Die Eingabeparameter stehen in runden Klammern(). Hier gibt es keine Eingabeparameter, da nur der Werte der Instanzvariablen name zurückgegebenwerden soll.
private Mitarbeiter findeMitarbeiter(String nachname, String vorname){
for(Mitarbeiter aktuellerMitarbeiter:mitarbeiterListe){
if(aktuellerMitarbeiter.equals(nachname)){
return aktuellerMitarbeiter;
}
}
return null;
}
Diese Methode ist nicht öffentlich zugänglich (private). Die Methode heißt findeMitarbeiter. Sie liefert ein Ergebnis vom Typ Mitarbeiter. Mitarbeiter ist ein Klasse. Somit wird ein Objekt zurückgeben. Weil eine Rückgabe erwartet wird, muss im Körper der Methode ein return-Befehl stehen. Da in jedem Falle ein Rückgabe erfolgen muss, wird der return Befehl am Ende der Methode ausgeführt, für den Fall, dass kein Mitarbeiter gefunden wurde. Der Algorithmus der Mitarbeitersuche wurde durch die Kontrollstrukturen Verzweigung und Schleife realisiert. Die Eingabeparameter stehen in runden Klammern(). Hier gibt es zwei Eingabeparameter vom Typ String. Der erste heißt nachname, der zweite vorname.
Das Überladen von Methoden ist sinnvoll, wenn Methoden eine vergleichbare Funktionalität haben und daher auch den gleichen Namen tragen sollten. Zwei Methoden einer Klasse heißen überladen, wenn sie den gleichen Namen, aber eine unterschiedliche Eingabeparameterliste haben. Ein abweichender Rückgabeparameter der Methoden ist für das Überladen nicht relevant.
Eine unterschiedliche Parameterliste bedeutet, dass die Anzahl und/oder die Typen der Parameter unterschiedlich sind. Es spielt keine Rolle, ob die Methoden in der Klasse deklariert sind oder ob sie von einer anderen Klasse geerbt wurden.
Beim Methodenaufruf wird die speziellste passende Methode ausgeführt. D.h. es wird automatisch die Methode ausgewählt, für die am wenigsten Parameter implizit in andere Datentypen konvertiert werden müssen. Diese Auswahl muss eindeutig sein.
Die folgenden Methoden ermitteln das Minimum einer Eingabeparameterliste. Methode 3 wird einen Compilerfehler auslösen, da sich die Signatur nur durch den Rückgabeparameter unterscheidet. Dies ist nicht ausreichend, um einer Methode zu überladen.
public class Berchnung
{
//Methode 1
public int min (int i1, int i2) {
if (i1<i2){
return i1;
}else{
return i2;
}
}
//Methode 2
public double min (double i1, double i2) {
if (i1<i2){
return i1;
}else{
return i2;
}
}
//Methode 3
public float min (double i1, double i2) {
if (i1<i2){
return i1;
}else{
return i2;
}
}
Polymorphie bedeutet "Vielgestaltigkeit." Im Bereich der Objektorientierung bezieht sich Polymorphie darauf, dass verschiedene Objekte bei Aufruf derselben Methode unterschiedliches Verhalten an den Tag legen können.