====== Eigene Klassen mit Methoden und Attributen ======
===== Beispiel 1: Würfel-Klasse (Methoden mit Parametern und Rückgabewerten) =====
Wir wollen in den folgenden Abschnitten eine Klasse ''Würfel'' schreiben und stetig verbessern. Zunächst wünschen wir uns ein Würfel-Objekt, das eine Methode ''würfle'' besitzt, die eine Zahl zwischen 1 und 6 ausgibt. Sie soll also folgendermaßen verwendet werden können:
Würfel w = new Würfel();
w.würfle();
class Würfel {
// Deklaration der Attribute
// Deklaration der Methoden
}
Zwischen den ''{ }'' werden die **Methoden** und **Attribute** der Klasse deklariert. \\ \\
**Deklaration einer Methode** \\
Eine Methode ohne Parameter und Rückgabewert (dazu weiter unten mehr) wird folgendermaßen deklariert:
void würfle(){
// Anweisungen
}
Zuerst wird der **Datentyp des Rückgabewertes** angegeben, in diesem Fall ''void'' [[https://dict.leo.org/englisch-deutsch/void|(engl: "Leere")]] für "Kein Rückgabewert". Es folgt der **Bezeichner** der Methode (hier: würfle) und ''()''. In die Klammern schreiben wir - falls benötigt - die **Deklaration der Parameter** (siehe weiter unten). Zwischen die ''{ }'' kommen die **Anweisungen**, die ausgeführt werden sollen, wenn die Methode aufgerufen wird. Man spricht oft vom **Methodenrumpf** (engl.: method body).
Würfel w = new Würfel();
w.würfle(6); // Würfle mit einem 6-seitigen Würfel und gib das Ergebnis aus
w.würfle(20); // Würfle mit einem 20-seitigen Würfel und gib das Ergebnis aus
w.würfle(20);
auf, so wird beim Aufruf eine Kopie des übergebenen Wertes in den Parameter ''seitenzahl'' geschrieben. Beim der nachfolgenden Berechnung des Terms
Math.floor(Math.random() * seitenzahl) + 1;
hat ''seitenzahl'' also den Wert 20. Wird die Methode später mit einem anderen Paramterwert aufgerufen, z.B. ''w.würfle(6);'', so wird beim Methodenaufruf eine Kopie //dieses// Wertes in den Parameter ''seitenzahl'' geschrieben. \\ \\
**Tipp:** \\
Führe das obige Programm in Einzelschritten aus und beobachte bei jedem Schritt, ob der Parameter ''seitenzahl'' im Reiter "Variablen" sichtbar ist und welchen Wert er hat. Achte dabei darauf, beim Methodenaufruf **nicht** auf den Button "Step over" ({{:klassen1:anwenden:step_over.png?nolink|}}) zu klicken, sondern auf den Button **"Step into"** ({{:klassen1:eigene:step-into.png?nolink|}}). Dieser bewirkt, dass die Methode nicht in einem Rutsch ausgeführt wird, sondern auch die Anweisungen im Methodenrumpf schrittweise abgearbeitet werden.
int würfle(int seitenzahl){ ... }
Methoden, die einen Wert zurückgeben, nennt man oft auch **Funktionen**.
double summe(double summand1, double summand2)
Beim Aufruf werden auch die Parameterwerte durch Kommas voneinander getrennt, z.B.
println(r.summe(2, 3.7));
* Die Parameter einer Methode können natürlich **verschiedene Datentypen** haben.
* Unterscheide im obigen Beispiel das **Komma** als Trennzeichen zwischen Parameterwerten vom **Dezimalpunkt**.
* **Gute Methodenbezeichner:** \\ Es ist guter Stil, Methoden, die keinen Wert zurückgeben, mit Verben zu bezeichnen, z.B. ''zeichneKreis'', ''würfle'' o.ä. \\ Methoden, die einen Wert zurückliefern, kann man auch mit Substantiven bezeichnen, die beschreiben, was zurückgeliefert wird, z.B. ''summe'' oder ''differenz''. \\ Per Konvention beginnen Methodenbezeichner immer mit einem Kleinbuchstaben.
void zeichneBaum(int baumbreite) {
zeichneKrone(baumbreite);
zeichneStamm(baumbreite);
}