5.1 Definition einer neuen Klasse

Beim Erstellen des Quellcodes einer neuen Klasse, werden der Name, die Attribute und die Methoden der Klasse aus dem UML-Klassendiagramm übernommen.

In diesem Unterkapitel werden wir auf Grundlage des folgenden UML-Klassendiagramms (vgl. Abb. 5.1) den Quellcode der Klasse Buch erstellen.

img/5_1_UML_Klasse_Buch.svg
Abb. 5-1: Klasse Buch (UML)

5.1.1 Definition einer Klasse

Der Quellcode einer Klasse gliedert sich in zwei Bereiche, den Klassenkopf und den Klassenkörper1.

Im Klassenkopf leitet das Schlüsselwort class die Klassendefinition ein. Anschließend folgt der Klassenname. Außerdem kann mit Hilfe eines Zugriffsmodifikators angegeben werden, wer die Klasse verwenden darf.

Die beiden geschweiften Klammern schließen den Klassenkörper ein. Hier werden die Attribute der Klasse deklariert und ihre Methoden definiert.

img/5_2_Definition_Klasse_Buch.svg
Abb. 5-2: Definition der Klasse Buch

Der Zugriffsmodifikator public stellt sicher, dass die hier definierte Klasse auch für Klassen, die sich nicht im gleichen Paket befinden, sichtbar und damit verwendbar ist.

5.1.2 Deklaration von Attributen

Die Deklaration eines Attributs umfasst die Bekanntgabe seines Namens und seines Datentyps. Außerdem wird mit Hilfe eines Zugriffsmodifikators festgelegt, wer direkt auf das Attribut zugreifen darf.

img/5_3_Deklaration_von_Attributen.svg
Abb. 5-3: Deklaration des Attributs titel

Die Deklaration der Attribute erfolgt üblicherweise zu Beginn des Klassenkörpers.

JAVA

public class Buch {
    private String isbn;
    //Deklaration weiterer Attribute ...
}

Abb. 5-4: Quellcode der Klasse Buch (Ausschnitt)

5.1.3 Definition von Methoden

Der Quellcode einer Methode gliedert sich in zwei Bereiche, den Methodenkopf und den Methodenkörper2.

Im Methodenkopf kann mit Hilfe eines Zugriffsmodifikators geregelt werden, wer auf die Methode zugreifen darf. Anschließend muss angegeben werden, ob die Methode eine Antwort an den Aufrufer zurückgibt. Ist dies der Fall, muss der Datentyp der möglichen Antwortwerte angegeben werden. Andernfalls zeigt das Schlüsselwort void an, dass die Methode keine Antwort zurückgibt. Abschließend folgt der Name der Methode, gefolgt von einer öffnenden und einer schließenden runden Klammer. Falls die Methode Parameter erfordert, werden diese innerhalb dieser runden Klammern deklariert.

Der Methodenkörper beziehungsweise Methodenrumpf enthält die Anweisungen, die die Methode ausführen soll, und wird durch die beiden geschweiften Klammern begrenzt.

img/5_5_Definition_von_Methoden_set.svg
Abb. 5-5: Definition der setIsbn-Methode

Die Referenz this ermöglicht es, innerhalb einer Methode auf das Objekt zu verweisen, dem die gerade ausgeführte Methode gehört.

Grundsätzlich kann auf die Angabe von this auch verzichtet werden. Zwingend ist die Angabe jedoch dann, wenn auf ein Attribut zugegriffen werden soll und es in der Methode zum Beispiel einen Parameter gleichen Namens gibt.

Merke: this
img/5_6_Definition_von_Methoden_get.svg
Abb. 5-6: Definition der getIsbn-Methode

Soll eine Methode einen Wert an das aufrufende Objekt zurückgeben, muss in ihrer Kopfzeile anstelle von void der Datentyp der möglichen Rückgabewerte angegeben werden.

Die Rückgabe erfolgt mit Hilfe des Schlüsselworts return, gefolgt vom jeweiligen Rückgabewert. Anschließend wird die Ausführung der Methode automatisch beendet. Daraus folgt, dass die return-Anweisung stets die letzte Anweisung einer Methode sein muss.

Merke: return

Die Methoden werden üblicherweise im Anschluss an die Deklaration der Attribute definiert. Die Reihenfolge spielt dabei keine Rolle.

JAVA

public class Buch {
    private String isbn;

    //Deklaration weiterer Attribute ...
    
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    
    public String getIsbn() {
        return this.isbn;
    }
    
    //Deklaration weiterer Attribute ...
}

Abb. 5-7: Quellcode der Klasse Buch (Ausschnitt)
Aufgabe

Aufgabe 5-1: Buch

Vervollständigen Sie den bisher erstellten Quellcode der Klasse Buch (vgl. Abb. 5.7) entsprechend dem folgenden UML-Klassendiagramm (vgl. Abb. 5.8).

img/5_1_UML_Klasse_Buch.svg
Abb. 5-8: Klasse Buch (UML)
JAVA
public class Buch {

    private String isbn;
    private String titel;
    private int erscheinungsjahr;
    
    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    
    public String getTitel() {
        return titel;
    }
    
    public void setTitel(String titel) {
        this.titel = titel;
    }
    
    public int getErscheinungsjahr() {
        return erscheinungsjahr;
    }
    
    public void setErscheinungsjahr(int erscheinungsjahr) {
        this.erscheinungsjahr = erscheinungsjahr;
    }

}
Abb. 5-9: Quellcode der Klasse Buch
Aufgabe

Aufgabe 5-2: Ort

Ein Marktforschungsinstitut lässt eine neue Software entwickeln, die alle Aktivitäten des Unternehmens im Bereich Marktuntersuchung abbildet und unterstützt.

Unter anderem wird eine Möglichkeit benötigt, alle Orte in Deutschland bezüglich der folgenden Aspekte auswerten zu können: Name, Einwohnerzahl, Kaufkraft (in EUR) und durchschnittliche Kaufkraft je Einwohner (in EUR).

  1. Entwickeln Sie ein geeignetes UML-Klassendiagramm. Lösung
    img/5_10_UML_Klasse_Ort.svg
    Abb. 5-10: Klasse Ort (UML)
  2. Erstellen Sie auf Grundlage des Klassendiagramms aus Teilaufgabe a) den Quellcode. Lösung
    JAVA
    public class Ort {

        private String name;
        private int einwohnerzahl;
        private double kaufkraft;
        
        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

        public void setEinwohnerzahl(int einwohnerzahl) {
            this.einwohnerzahl = einwohnerzahl;
        }

        public int getEinwohnerzahl() {
            return this.einwohnerzahl;
        }

        public void setKaufkraft(double kaufkraft) {
            this.kaufkraft = kaufkraft;
        }

        public double getKaufkraft() {
            return this.kaufkraft;
        }
        
        public double berechneKaufkraftJeEinwohner() {
            return this.kaufkraft/this.einwohnerzahl;
        }

    }
    Abb. 5-11: Quellcode der Klasse Ort
Aufgabe

Aufgabe 5-3: Mitarbeiter

Sie sind Teil eines Projektteams, das eine objektorientierte Software zur Personalverwaltung entwickelt. Ihre Aufgabe besteht dabei darin, eine Möglichkeit zu schaffen, die Mitarbeiter des jeweiligen Unternehmens innerhalb der Software abzubilden.

Nehmen Sie vereinfachend an, dass für jeden Mitarbeiter lediglich Vor- und Nachname, Monatsgehalt sowie die Anzahl der jährlich zustehenden Urlaubstage erfasst werden sollen. Außerdem soll es möglich sein, neben dem Monatsgehalt auch das Jahresgehalt eines Mitarbeiters abzufragen.

  1. Entwickeln Sie ein geeignetes UML-Klassendiagramm. Lösung
    img/5_12_UML_Klasse_Mitarbeiter.svg
    Abb. 5-12: Klasse Mitarbeiter (UML)
  2. Erstellen Sie auf Grundlage des Klassendiagramms aus Teilaufgabe a) den Quellcode. Lösung
    JAVA
    public class Mitarbeiter {

        private String vorname;
        private String nachname;
        private double monatsgehalt;
        private int urlaubstage;

        public void setVorname(String vorname){
            this.vorname = vorname;
        }

        public String getVorname(){
            return this.vorname;
        }

        public void setNachname(String nachname){
            this.nachname = nachname;
        }

        public String getNachname(){
            return this.nachname;
        }

        public void setMonatsgehalt(double monatsgehalt){
            this.monatsgehalt = monatsgehalt;
        }

        public double getMonatsgehalt(){
            return this.monatsgehalt;
        }

        public void setUrlaubstage(int urlaubstage){
            this.urlaubstage = urlaubstage;
        }

        public int getUrlaubstage(){
            return this.urlaubstage;
        }
        
        public double berechneJahresgehalt(){
            return this.monatsgehalt * 12;
        }
    }
    Abb. 5-13: Quellcode der Klasse Mitarbeiter
Aufgabe

Aufgabe 5-4: Szenario – „blinken in allen Farben“

Ziel des dritten Szenarios ist es, dass ein weißer Roboter von Feld (1;1) aus startet und mit einer Geschwindigkeit von 2 das Zielfeld erreicht. Dabei soll der Roboter jedes Mal, wenn er auf seinem Weg ein Eckfeld – (3;1), (3;3), (1;3) – erreicht, nacheinander rot, gelb und blau aufleuchten, bevor er wieder weiß wird und den Weg fortsetzt. Nutzen Sie für die Zuweisung einer neuen Farbe jeweils die Methode setFarbe(pFarbe: String) der Klasse Roboter.

  1. Erstellen Sie mit dem Editor das Spielbrett s3 und passen Sie den Quellcode der Klasse Szenario entsprechend an.
  2. Um nicht jedes Mal, wenn der Roboter blinken soll, alle dafür notwendigen Anweisungen erneut notieren zu müssen, ist es sinnvoll diese Anweisungen in eine eigene Methode auszulagern. Erstellen Sie dazu in der Klasse Szenario die Methode blinken() und kopieren Sie die betreffenden Anweisungen in die Methode. Passen Sie den Quellcode der Methode steuereRobi() dann so an, dass an den Stellen, an denen der Farbwechsel erfolgen soll, die Methode blinken() aufgerufen wird. Klären Sie, ob die Methode blinken() öffentlich sein muss oder es ausreicht, wenn sie als privat deklariert ist.
Spielbrett s3
Abb. 5-14: Spielbrett s3
JAVA
public class SzenarioAufgabe5_4 implements Szenario{

    private String name = "Aufgabe 5-4: Szenario – „blinken in allen Farben“";
    private Roboter robi;

    @Override
    public void erstelleRobi(Spielbrett ausgewaehltesSpielbrett){
        robi = new Roboter ();
        robi.starteAufFeld(1, 1, ausgewaehltesSpielbrett);
        robi.setGeschwindigkeit(2);
    }

    @Override
    public void steuereRobi() {
        robi.gehVorwaerts();
        robi.gehVorwaerts();
        this.blinken();
        robi.drehRechts();
        robi.gehVorwaerts();
        robi.gehVorwaerts();
        this.blinken();
        robi.drehRechts();
        robi.gehVorwaerts();
        robi.gehVorwaerts();
        this.blinken();
    }

    private void blinken() {
        robi.setFarbe("rot");
        robi.setFarbe("gelb");
        robi.setFarbe("blau");
        robi.setFarbe("weiss");
    }

    @Override
    public String getName() {
        return name;
    }

}
Abb. 5-15: Quellcode der Klasse Szenario