Benutzer-Werkzeuge

Webseiten-Werkzeuge


klassen1:eigene:start

Erste eigene Klassen!

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();

Definition einer Klasse
Eine Klasse wird mit dem Schlüsselwort class definiert:

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 (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).

Erste Erweiterung: Übergabe der Seitenzahl als Parameter

Es gibt nicht nur 6-seitige Würfel, sondern auch 8-seitige, 20-seitige usw. Wir erweitern die Methode würfle so, dass beim Aufruf die Anzahl der Seiten des Würfels mit angegeben werden kann:

   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

Wie bringen wir die Information darüber, wie viele Seiten der Würfel hat (oben: 6 bzw. 20) in die Methode und wie erreichen wir, dass diese Information dort berücksichtigt wird?

Wir deklarieren einen Parameter!

Die Parameter einer Methode legen fest, welche Werte beim Aufruf der Methode an den Methodenrumpf übergeben werden, welche Datentypen sie besitzen und mit welchem Bezeichner sie innerhalb der Methode verwendet werden können.

void würfle(int seitenzahl) deklariert die Methode würfle mit dem Parameter seitenzahl vom Datentyp int. Ruft man die Methode beispielsweise durch

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“ () zu klicken, sondern auf den Button „Step into“ (). Dieser bewirkt, dass die Methode nicht in einem Rutsch ausgeführt wird, sondern auch die Anweisungen im Methodenrumpf schrittweise abgearbeitet werden.

Zweite Erweiterung: Rückgabe des Würfelergebnisses

Das Würfelergebnis soll durch die Methode nicht am Bildschirm ausgegeben werden, sondern es soll an die Aufrufstelle zurückgegeben werden, so dass es im Folgenden weiterverarbeitet werden kann:

   Würfel w = new Würfel();
   int ergebnis = w.würfle(6);     // Würfle mit einem 6-seitigen Würfel und gib das Ergebnis ALS WERT ZURÜCK
   println("Gewürfelte Zahl: " + ergebnis);    

Mit Hilfe der return-Anweisung kann eine Methode einen Wert an die aufrufende Stelle zurückgeben. Der Datentyp wird bei der Deklaration der Methode vor dem Methodenbezeichner angegeben, z.B.

int würfle(int seitenzahl){ ... }

Methoden, die einen Wert zurückgeben, nennt man oft auch Funktionen.

Beispiel 2: Klasse "Katze"

Wir schreiben eine Klasse Katze mit den Attributen name, Fellfarbe und Beinzahl sowie den Methoden stellDichVor() und sagWas(String text).

Beispiel 3: Rechner-Klasse (mehrere Parameter)

Wir schreiben eine Klasse Rechner mit Methoden summe, differenz und potenz und berechnen damit $2^3 + 5$.

Methoden mit mehreren Parametern

Methoden können auch mehrere Parameter haben. Sie werden einfach mit Komma getrennt hintereinander deklariert, z.B.

   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.

Beispiel 4: Weihnachtsbaum (Methoden rufen sich gegenseitig auf)

Schreibe eine Klasse Baum, mit einer Methode zeichneBaum(int breite), die wiederum die Methoden zeichneKrone(int breite) und zeichneStamm(int stammbreite) aufruft um damit einen Baum wie in der nebenstehenden Abbildung zu zeichnen.

Methoden eines Objekts können andere Methoden desselben Objekts aufrufen. Dadurch lassen sich komplexe Methoden (z.B. zeichneBaum) in weniger komplexe Methoden (zeichneKrone, zeichneStamm) zerlegen, die wiederum auf noch einfachere Methoden (gibZeichenAus) zurückgreifen, usw.
Aus einer Methode eines Objekts heraus ruft man eine andere Methode desselben Objekts auf, in dem man einfach ihren Bezeichner verwendet (ohne „Punktschreibweise“), z.B.

   void zeichneBaum(int baumbreite) {
      zeichneKrone(baumbreite);
      zeichneStamm(baumbreite);
   }

Beispiel 5: ASCII-Art-Klasse

Kennst Du ASCII-Art? Wir schreiben eine Klasse AsciiArt, deren Methoden geometrische Figuren ausgeben, die aus Textzeichen zusammengesetzt sind.

Hier ein Beispielprogramm und seine Ausgabe:

AsciiArt art = new AsciiArt();
 
// Rechteck mit Breite 8, Höhe 6
art.zeichneRechteck(8, 6, Color.lightblue); 
// Kreuz mit Balkendicke 3, Höhe 13
art.zeichneKreuz(2, 10, Color.lightgreen);
// Kreis mit Radius 8
art.zeichneKreis(4, Color.yellow);

Aufgabe 1

Schreibe eine Klasse GeoHelfer mit den Methoden berechneDreiecksfläche, berechneZylindervolumen und berechneZylinderOberfläche.

Hier ein Tipp

Aufgabe 2

Schreibe eine Klasse ZahlenHelfer mit folgenden Methoden:

  • Die Methode zufall bekommt als Parameter zwei ganze Zahlen von und bis und gibt eine zufällige ganze Zahl zwischen von und bis zurück.
  • Die Methode summe bekommt als Parameter eine ganze Zahl z und gibt die Summe $1 + 2 + \ldots + z$ zurück.

Hier ein kleiner Tipp

Aufgabe 3 (etwas schwerer...)

Erweitere die Klasse AsciiArt von oben um eine Methode void zeichneX(int breite, int linienstärke, String farbe), die ein großes X aus lauter X-Zeichen zusammensetzt. Die Ausgabe von art.zeichneX(10, 2, Color.pink); sieht beispielsweise so aus, wie im Bild rechts zu sehen.

Hier geht's zur Lösung!

klassen1/eigene/start.txt · Zuletzt geändert: 2024/08/31 10:03 von 127.0.0.1