Methoden

Grundwissen
Präsentation zur Motivation: Klassenkarte-zu-Java

Im letzten Kapitel hast Du gelernt, wie man Attribute in Greenfoot (in Java) verwendet. Du weißt schon, dass der Zustand eines Objekts durch Methoden verändert werden kann. Beim Aufruf einer Methode werden die Objektattribute manipuliert. Eine Methode hat folgenden Aufbau:

  • Zugriffsmodifikator Wer darf die Methode benutzen (Vorerst „public“ oder „private“ später mehr)
  • Rückgabetyp Methoden können keinen (void) oder beliebige Datentypen als ergebnis „zurückliefern“
  • Methodenname beliebigerName für die Methode
  • Parameterliste Der Methode können beliebig viele Daten zur Verarbeitung mitgegeben werden
  • Methodenrumpf Hier wird festgelegt, was die Methode eigentlich tun soll

Die Verwendung von vordefinierten Methoden
Du hast im Beispielprojekt schon gesehen wie man Methodenaufrufe an einem Objekt tätigt. Du weißt nun ebenfalls wie man eigene Attribute in einer Klasse notiert.

Ein paar Beispiel für Methoden:

Eine Methode, welche einen zusammengesetzten Wert zurück gibt: Hello Fritz! Fritz ist hierbei die aktuelle Belegung der als Parameter übergebenen Zeichenkette name.

Eine „stumme“ Methode, welche keinen Wert zurück gibt sondern ganz im Stillen eine bestimmte Aufgabe ausführt.

Eine Methode welche nur dazu da ist, eine aktuelle Attributbelegung auszugeben. Sie hat den Rückgabetyp int und bekommt keine Parameter übergeben!

Wie werden denn die Attribute nun mit konkreten Attributwerten belegt?

Sollen die Attribute ab dem Zeitpunkt der Objekterzeugung einen Wert tragen, so werden die Werte über den Konstruktor gesetzt. Der Konstruktor ist eine ganz besondere Methode die beim Erzeugen eines Objekts aufgerufen wird, keinen Rückgabetyp hat und den Namen der Klasse hat.:

Beachte: Die Wertzuweisung geschieht von links nach rechts! Die Variable „art“ wird mit dem Wert von „str“ ersetzt (mehr zu Variablen später).

Beim Erzeugen eines Ant-Objekts (beim Aufruf des Konstruktors über „new Ant“) fragt uns Greenfoot dann nach den entsprechenden Eingaben:

Nach dem Klicken von „OK“, haben wir unsere Ameise mit den entsprechenden Attributwerten versehen. Dies kann man leicht durch das Inspizieren des Ant-Objekts herausfinden – Rechtklick aufs Objekt:

Man kann auch später (also nach dem Erzeugen des Objektes) durch Methodenaufruf auf einem Objekt dessen Attribute verändern oder deren aktuellen Werte erfragen. Wirf einen Blick auf die Aufgaben, um mehr zu erfahren!

Aufgaben
Arbeitsblatt

1. Vorletzte Stunde hast Du das Ant-Projekt begonnen und in der letzten Stunde hast Du eigene Attribute hinzugefügt. Ergänze nun einen passenden Konstruktor, welcher alle Attribute auf einen bestimmten Wert initialisiert (die Werte darfst Du Dir selber ausdenken!). Das bedeutet: Der Konstruktor bekommt keine Parameter übergeben und Du setzt im Methodenrumpf des Konstruktors feste Werte! Der Konstruktor ist nach den Attributen die erste Methode:

2. Du hast bereits das Projekt GF-02-Turtle heruntergeladen. Ergänze auch hier einen Konstruktor welcher die Attribute initialisiert. Nun sollen die Attribute aber, im Gegensatz zu Augabe 1, über die Parameter des Konstruktors initialisiert werden. Schau Dir hierzu das Beispiel oben aus dem Grundwissensbereich an

3. Hat man ein Objekt erzeugt, so kann man den Zustand des Objekts durch Methodenaufrufe verändern. Da der Objektzustand nichts anderes als die Belegung sämtlicher Attribute ist, muss durch entsprechende Methodenaufrufe die Belegung verändert werden. Probier es aus: nameSetzen

4. Methoden wie die obige nennt man setter-Methode, weil sie den Wert eines Attributs neu setzt! Es gibt auch getter-Methoden, welche den aktuellen Wert eines Attributs zurückgeben. Füge dem Turtle-Projekt nun die getter-Methode nameGeben() hinzu. Diese bewirkt einfach nur die Rückgabe des gewünschten Attributs.

Beachte:

  • nameGeben() hat keine Parameter,
  • sie muss den Rückgabetyp besitzen, welcher dem Datentyp des gewünschten Attributs entspricht und
  • der letzte befehl im Methodenrumpf muss lauten: return name;

„name“ steht hier natürlich für den Namen des Attributs – das Attribut „alter“ müsste über „return alter;“ zurückgegeben werden!

5. Public vs Private: Lade das Projekt GF-03-MatheFuchs. Programmiere nun die Klasse MatheFuchs nach folgenden Vorgaben:

  • Deklariere in der Klasse das Attribut pi. Es ist vom Datentyp double!
  • Füge den Konstruktor ein! Dieser soll keinen Parameter bekommen. Im Rumpf wird das Attribut auf den Wert 3.1415 initialisiert!
  • Kopiere den Code der unten aufgeführten private Methode gibPi()! Diese gibt den Attributwert von Pi zurück! Aber warum private? Probiere aus, ob Du die Methode überhaupt auf diese Weise am Objekt aufrufen kannst! Wenn nicht, dann ändere sie lieber zu public 🙂

private double gibPi()
{
return pi;
}

  • Implementiere nun mit Deinem Lehrer gemeinsam die öffentliche Methode kreisUmfang(double radius) welche den Kreisumfang eines Kreises des Radius radius berechnet und zurückgibt. Verwende zur Berechnung Dein private Attribut pi. Wenn Du nicht weißt, wie man in Java einfache Arithmetische Rechnungen durchführt, dann hilft Dir beispielsweise folgendes Google-Suchergebnis: https://de.wikibooks.org/wiki/Java_Standard:_Operatoren#Arithmetische_Operatoren
  • Implementiere nun die öffentliche Methode kreisFlaeche(double radius) (Voricht! Keine Umlaute in Java bitte!) welche die Kreisfläche eines Kreises des Radius radius berechnet und zurückgibt. Verwende auch hier wieder Dein private Attribut pi.
  • Winkel können in der Mathematik auf unterschiedliche Weise angegeben werden. Das bekannteste Maß ist das Gradmaß: eine vollständige Umdrehung entspricht 360°. Ein anderes sehr wichtiges Maß ist das Bogenmaß – damit wirst Du Dich dieses Jahr in Mathematik ausführlich beschäftigen: 0° entspricht im Bogenmaß der Zahl 0, 360° entspricht der Zahl 2π (also 2 mal 3,1415…). Implementiere nun die öffentliche Methode bogenMassZuGrad(double bogenMass) welche einen im Bogenmaß übergebenen Winkel ins Gradmaß überträgt und zurückgibt!
  • Implementiere nun die öffentliche Methode gradZuBogenMass(double grad) welche einen im Gradmaß übergebenen Winkel ins Bogenmaß überträgt und zurückgibt!
  • FÜR DIE SCHNELLEN: Implementiere nun die öffentliche Methode volumen(double radius) welche das Volumen einer Kugel mit übergebenem Radius zurückgibt! ACHTUNG! Du benötigst den Bruch 4/3! Wenn Du in Java den Term 4/3 mit ganze nZahlen schreibst (3 und 4), geht Java davon aus, dass Du auch als Ergebnis eine Ganzzahl wünschst und schneidet den Nachkommateil einfach ab. Lösung: 4 / 3.0
  • FÜR DIE SCHNELLEN: Implementiere nun die öffentliche Methode oberflaeche(double radius) welche die Oberfläche einer Kugel mit übergebenem Radius zurückgibt!

    6. Methoden mit mehreren Parametern:
  • Lade das Projekt GF-04-SpaceShuttle (Stick bzw. Netzlaufwerk) GF-SpaceShuttle

    Bearbeite die Klasse der Rakete folgendermaßen:
  • Verpasse der Rakete ein Attribut rotation (Ganzzahl!) und das Attribut schrittWeite (Ganzzahl!).
  • Implementiere einen Konstruktor dem zwei ganzzahlige Parameter übergeben werden. Das Attribut rotation wird im Konstruktorrumpf auf den übergebenen Wert gesetzt, das Attribut schrittWeite auf den zweiten übergebenen Wert!
  • Implementiere die void-Methode act() wie folgt: der Methodenrumpf besteht nur aus zwei Zeilen: move(schrittWeite); und turn(rotation); Weißt Du, woher diese Methoden kommen? Sie fallen doch sicherlich nicht vom Himmel, aber in der Klasse „Rakete“ wirst Du sie nicht finden. Stichwort: Rakete hat Eltern!
  • Implementiere die Methode attributeNeuSetzen(int neueRot, int neueSchrittWeite) welche das Attribut rotation und das Attribut schrittWeite auf den jeweils neuen Wert setzt.
  • Kompiliere alles, erzeuge eine Rakete und betätige den Run-Button. Weißt Du noch, was durch das Betätigen des Run-Buttons geschieht?
  • Du kannst den Ablauf pausieren indem Du den Pause-Button drückst. Probiere dann durch den Methodenaufruf attributeNeuSetzen(…)unterschiedliche rotationen und Schrittweiten aus und versuche die Rakete im Bild (Bühne) zu behalten während Sie sich dreht (Tipp: große SchrittWeiten und kleine Radien!)

6. Methoden mit mehreren Parametern:

  • Lade das Projekt GF-04-SpaceShuttle (Stick bzw. Netzlaufwerk) GF-SpaceShuttle

Bearbeite die Klasse der Rakete folgendermaßen:

  • Verpasse der Rakete ein Attribut rotation (Ganzzahl!) und das Attribut schrittWeite (Ganzzahl!).
  • Implementiere einen Konstruktor dem zwei ganzzahlige Parameter übergeben werden. Das Attribut rotation wird im Konstruktorrumpf auf den übergebenen Wert gesetzt, das Attribut schrittWeite auf den zweiten übergebenen Wert!
  • Implementiere die void-Methode act() wie folgt: der Methodenrumpf besteht nur aus zwei Zeilen: move(schrittWeite); und turn(rotation); Weißt Du, woher diese Methoden kommen? Sie fallen doch sicherlich nicht vom Himmel, aber in der Klasse „Rakete“ wirst Du sie nicht finden. Stichwort: Rakete hat Eltern!
  • Implementiere die Methode attributeNeuSetzen(int neueRot, int neueSchrittWeite) welche das Attribut rotation und das Attribut schrittWeite auf den jeweils neuen Wert setzt.
  • Kompiliere alles, erzeuge eine Rakete und betätige den Run-Button. Weißt Du noch, was durch das Betätigen des Run-Buttons geschieht?
  • Du kannst den Ablauf pausieren indem Du den Pause-Button drückst. Probiere dann durch den Methodenaufruf attributeNeuSetzen(…)unterschiedliche rotationen und Schrittweiten aus und versuche die Rakete im Bild (Bühne) zu behalten während Sie sich dreht (Tipp: große SchrittWeiten und kleine Radien!)