klassen1:eigene:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | klassen1:eigene:start [2024/08/31 10:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Erste eigene Klassen! ====== | ||
+ | ===== Beispiel 1: Würfel-Klasse (Methoden mit Parametern und Rückgabewerten) ===== | ||
+ | Wir wollen in den folgenden Abschnitten eine Klasse '' | ||
+ | <code myjava> | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Würfel w = new Würfel(); | ||
+ | w.würfle(); | ||
+ | |||
+ | class Würfel { | ||
+ | |||
+ | void würfle(){ | ||
+ | int zahl = Math.floor(Math.random() * 6) + 1; | ||
+ | println(zahl); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | ** Definition einer Klasse** \\ | ||
+ | Eine Klasse wird mit dem Schlüsselwort '' | ||
+ | <code myjava> | ||
+ | class Würfel { | ||
+ | // Deklaration der Attribute | ||
+ | // Deklaration der Methoden | ||
+ | } | ||
+ | </ | ||
+ | Zwischen den '' | ||
+ | **Deklaration einer Methode** \\ | ||
+ | Eine Methode ohne Parameter und Rückgabewert (dazu weiter unten mehr) wird folgendermaßen deklariert: | ||
+ | <code myjava> | ||
+ | void würfle(){ | ||
+ | // Anweisungen | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | Zuerst wird der **Datentyp des Rückgabewertes** angegeben, in diesem Fall '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Erste Erweiterung: | ||
+ | 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: | ||
+ | <code myjava> | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | <WRAP center round help 80%> | ||
+ | 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**! | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Würfel w = new Würfel(); | ||
+ | w.würfle(20); | ||
+ | w.würfle(6); | ||
+ | |||
+ | class Würfel { | ||
+ | |||
+ | void würfle(int seitenzahl){ | ||
+ | int zahl = Math.floor(Math.random() * seitenzahl) + 1; | ||
+ | println(zahl); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | 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. \\ \\ | ||
+ | '' | ||
+ | <code myjava> | ||
+ | w.würfle(20); | ||
+ | </ | ||
+ | auf, so wird beim Aufruf eine Kopie des übergebenen Wertes in den Parameter '' | ||
+ | <code myjava> | ||
+ | | ||
+ | </ | ||
+ | hat '' | ||
+ | **Tipp:** \\ | ||
+ | Führe das obige Programm in Einzelschritten aus und beobachte bei jedem Schritt, ob der Parameter '' | ||
+ | </ | ||
+ | |||
+ | ==== Zweite Erweiterung: | ||
+ | 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: | ||
+ | <code myjava> | ||
+ | | ||
+ | int ergebnis = w.würfle(6); | ||
+ | | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Würfel w = new Würfel(); | ||
+ | int ergebnis = w.würfle(6); | ||
+ | println(" | ||
+ | |||
+ | class Würfel { | ||
+ | |||
+ | int würfle(int seitenzahl){ | ||
+ | int zahl = Math.floor(Math.random() * seitenzahl) + 1; | ||
+ | return zahl; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Mit Hilfe der '' | ||
+ | <code myjava> | ||
+ | int würfle(int seitenzahl){ ... } | ||
+ | </ | ||
+ | |||
+ | Methoden, die einen Wert zurückgeben, | ||
+ | </ | ||
+ | |||
+ | ===== Beispiel 2: Klasse " | ||
+ | Wir schreiben eine Klasse Katze mit den Attributen '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Katze snoopy = new Katze(); | ||
+ | snoopy.name = " | ||
+ | snoopy.fellfarbe = " | ||
+ | snoopy.beinzahl = 4; | ||
+ | snoopy.sagWas(" | ||
+ | snoopy.stellDichVor(); | ||
+ | |||
+ | Katze b = new Katze(); | ||
+ | b.sagWas(" | ||
+ | b.name = " | ||
+ | b.fellfarbe = " | ||
+ | b.beinzahl = 3; | ||
+ | b.stellDichVor(); | ||
+ | |||
+ | |||
+ | class Katze { | ||
+ | |||
+ | | ||
+ | | ||
+ | int beinzahl; | ||
+ | |||
+ | void sagWas(String text) { | ||
+ | println(text, | ||
+ | } | ||
+ | |||
+ | void stellDichVor() { | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Beispiel 3: Rechner-Klasse (mehrere Parameter) ===== | ||
+ | Wir schreiben eine Klasse Rechner mit Methoden '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Rechner r = new Rechner(); | ||
+ | println(r.summe(r.potenz(2, | ||
+ | |||
+ | class Rechner { | ||
+ | | ||
+ | return summand1 + summand2; | ||
+ | } | ||
+ | |||
+ | | ||
+ | return minuend - subtrahend; | ||
+ | } | ||
+ | |||
+ | | ||
+ | double ergebnis = 1; | ||
+ | for(int i = 0; i < exponent; i++) { | ||
+ | | ||
+ | } | ||
+ | return ergebnis; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | **Methoden mit mehreren Parametern** \\ \\ | ||
+ | Methoden können auch mehrere Parameter haben. Sie werden einfach mit Komma getrennt hintereinander deklariert, z.B. | ||
+ | <code myjava> | ||
+ | | ||
+ | </ | ||
+ | Beim Aufruf werden auch die Parameterwerte durch Kommas voneinander getrennt, z.B. | ||
+ | <code myjava> | ||
+ | | ||
+ | </ | ||
+ | * 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: | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | ===== Beispiel 4: Weihnachtsbaum (Methoden rufen sich gegenseitig auf) ===== | ||
+ | Schreibe eine Klasse '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Baum b = new Baum(); | ||
+ | b.zeichneBaum(21); | ||
+ | |||
+ | class Baum { | ||
+ | |||
+ | void zeichneBaum(int baumbreite) { | ||
+ | zeichneKrone(baumbreite); | ||
+ | zeichneStamm(baumbreite); | ||
+ | } | ||
+ | |||
+ | void zeichneKrone(int breite) { | ||
+ | for(int i = 1; i <= breite; i = i + 2) { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | zeichneKronenPunkt(); | ||
+ | } | ||
+ | |||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zeichneKronenPunkt() { | ||
+ | if(Math.random() < 0.7) { | ||
+ | | ||
+ | } else if(Math.random() < 0.4) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zeichneStamm(int baumbreite) { | ||
+ | int stammbreite = baumbreite / 5; | ||
+ | if(stammbreite % 2 == 0) { | ||
+ | | ||
+ | } | ||
+ | if(stammbreite < 1) { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | int stammhöhe = stammbreite * 3 / 2; | ||
+ | for(int zeile = 1; zeile <= stammhöhe; zeile++) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void gibZeichenAus(String zeichen, int anzahl, String farbe) { | ||
+ | for(int i = 1; i <= anzahl; i++) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | Methoden eines Objekts können **andere Methoden desselben Objekts aufrufen**. Dadurch lassen sich komplexe Methoden (z.B. '' | ||
+ | Aus einer Methode eines Objekts heraus ruft man eine andere Methode desselben Objekts auf, in dem man einfach ihren Bezeichner verwendet (ohne " | ||
+ | <code myjava> | ||
+ | void zeichneBaum(int baumbreite) { | ||
+ | zeichneKrone(baumbreite); | ||
+ | zeichneStamm(baumbreite); | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Beispiel 5: ASCII-Art-Klasse ===== | ||
+ | {{ : | ||
+ | Kennst Du [[https:// | ||
+ | Hier ein Beispielprogramm und seine Ausgabe: | ||
+ | <code myjava> | ||
+ | AsciiArt art = new AsciiArt(); | ||
+ | |||
+ | // Rechteck mit Breite 8, Höhe 6 | ||
+ | art.zeichneRechteck(8, | ||
+ | // Kreuz mit Balkendicke 3, Höhe 13 | ||
+ | art.zeichneKreuz(2, | ||
+ | // Kreis mit Radius 8 | ||
+ | art.zeichneKreis(4, | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | AsciiArt art = new AsciiArt(); | ||
+ | |||
+ | // Rechteck mit Breite 8, Höhe 6 | ||
+ | art.zeichneRechteck(8, | ||
+ | // Kreuz mit Balkendicke 3, Höhe 13 | ||
+ | art.zeichneKreuz(2, | ||
+ | // Kreis mit Radius 8 | ||
+ | art.zeichneKreis(4, | ||
+ | |||
+ | |||
+ | class AsciiArt { | ||
+ | |||
+ | void zeichneRechteck(int breite, int höhe, String farbe) { | ||
+ | | ||
+ | print(" | ||
+ | gibAus(" | ||
+ | print(" | ||
+ | println(); | ||
+ | |||
+ | for(int i = 1; i <= höhe - 2; i++) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | print(" | ||
+ | gibAus(" | ||
+ | print(" | ||
+ | println(); | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | void gibAus(String zeichen, int anzahl, String farbe) { | ||
+ | for(int i = 1; i <= anzahl; i++) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zeichneKreis(int radius, String farbe) { | ||
+ | for(int zeile = 0; zeile <= 2 * radius; zeile++) { | ||
+ | | ||
+ | double dx = radius + 0.5 - zeile; | ||
+ | double dy = radius + 0.5 - spalte; | ||
+ | if(Math.sqrt(dx * dx + dy * dy) <= radius) { | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void zeichneKreuz(int dicke, int höhe, String farbe) { | ||
+ | | ||
+ | int d = (höhe - dicke) / 2; // überstehende Balkenlänge | ||
+ | for(int i = 1; i <= d; i++) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | for(int i = 1; i <= dicke; i++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | for(int i = 1; i <= d; i++) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Aufgabe 1 ===== | ||
+ | Schreibe eine Klasse '' | ||
+ | |||
+ | [[.aufgabe1Tipp: | ||
+ | ===== Aufgabe 2 ===== | ||
+ | Schreibe eine Klasse '' | ||
+ | * Die Methode '' | ||
+ | * Die Methode '' | ||
+ | |||
+ | [[.aufgabe2: | ||
+ | |||
+ | |||
+ | ===== Aufgabe 3 (etwas schwerer...) ===== | ||
+ | {{ : | ||
+ | Erweitere die Klasse '' | ||
+ | |||
+ | [[.aufgaben: |
klassen1/eigene/start.txt · Zuletzt geändert: 2024/08/31 10:03 von 127.0.0.1