1. Die Klasse Kfz
Klasse Kfz
Die Klasse Kfz
erhält allgemeine Attribute und Methoden, also Eigenschaften und Fähigkeiten, die jedes Kfz
-Objekt besitzen muss. Später im Projekt werden wir die Klassen Pkw
und Lkw
erstellen, die die Attribute und Methoden von Kfz erben.
Attribute
Die Klasse Kfz
erhält zunächst 2 Attribute: marke
hat natürlich den Typ String
, kmStand
soll nur ganze Kilometerzahlen speichern, also reicht hier int
. Alle Attribute werden private
gesetzt.
public class Kfz {
private String marke;
private int kmStand;
Konstruktor
Der Konstruktor erhält einen Parameter marke
, der im Attribut marke
gespeichert wird. Das Attribut kmStand
wird im Konstruktor auf 0
gesetzt, für kmStand
ist also kein Parameter nötig.
Um die Parameternamen und die Attributnamen zu unterscheiden, gibt es das Schlüsselwort this
: this.marke
ist das Attribut, marke
ist der Parameter. Dies gilt nicht nur im Konstruktor, sondern in allen Methoden.
Mit der letzten Anweisung wird auf der Konsole ausgegeben, das das Objekt erstellt wurde.
public Kfz(String marke) {
this.marke = marke;
this.kmStand = 0;
System.out.println("---------------------------------");
System.out.println("Objekterstellung " + this.marke);
}
Setter und Getter
Die Attribute sind private
, also von anderen Klassen aus nicht zugreifbar. Um ein Attribut von anderen Klassen aus lesen zu können, braucht es einen Getter.
Der Getter eines Attributs ist eine Methode, die den Wert des Attributs zurückgibt. Der Name des Getters ist normalerweise get<Attributname>()
, und sein Rückgabetyp ist der Datentyp des Attributs.
Der Setter eines Attributs ist eine Methode, mit der der Wert des Attributs geändert werden kann. Der Name des Setters ist normalerweise set<Attributname>()
, sein Rückgabetyp ist void
und er hat einen Parameter mit demselben Datentyp wie das Attribut.
Ob Getter und Setter sinnvoll sind, muss individuell entschieden werden. In unserem Beispiel wird für marke
kein Setter geschrieben, weil die Marke eines Kfz sich normalerweise nie ändert. Für kmStand
werden Getter und Setter geschrieben.
public String getMarke() {
return this.marke;
}
public int getKmStand() {
return this.kmStand;
}
public void setKmStand(int kmStand) {
this.kmStand = kmStand;
}
Die Methode fahre()
Die Methode fahre() ist zunächst sehr einfach: sie erhält als Parameter die km-Zahl der Strecke, die gefahren wird. Diesen Parameter addiert sie zum Attribut kmStand.
Damit in der Konsole gut nachvollziehbar ist, welche Werte des Kfz-Objekts sich bei Ausführung der Methode ändern, werden die Informationen ausgegeben: die geplante Fahrtstrecke (= der Wert des Parameters), und der neue km-Stand.
Außerdem wird eine Überschrift ausgegeben, damit klar ist, welche Methode gerade an welchem Objekt ausgeführt wurde. Die vielen Leerzeichen in den System.out.println()
-Anweisungen sorgen dafür, dass die Ausgaben bündig angeordnet sind. Dies wird im Folgenden bei allen Methoden so gemacht.
public void fahre(int strecke) {
System.out.println("---------------------------------");
System.out.println("Fahrtvorgang " + this.marke + ":");
System.out.println("Geplante Fahrtstrecke : " + strecke + " km");
this.kmStand += strecke;
System.out.println("neuer Km-Stand : " + this.kmStand + " km");
}
Klasse Verkehr
Die Klasse Verkehr
enthält die main-Methode. Darin werden 2 Objekte der Klasse Kfz erzeugt. Sie erhalten die Variablennamen kfz1
und kfz2
. Man nennt sie auch Objektvariablen.
An den Objekten können nun die Methoden aufgerufen werden, also fahre()
, sowie die Setter und Getter, soweit vorhanden.
Dabei werden auch unzulässige bzw. unsinnige Anweisungen ausprobiert, um zu testen, ob noch Verbesserungen im Quellcode notwendig sind.
public class Verkehr {
public static void main(String[] args) {
Kfz kfz1 = new Kfz("VW");
Kfz kfz2 = new Kfz("BMW");
kfz1.fahre(78);
kfz2.fahre(220);
kfz1.fahre(23);
kfz2.fahre(65);
System.out.println();
System.out.println("Versuchte Manipulation des km-Stands");
kfz2.setKmStand(100);
System.out.println();
System.out.println("Aktuelle km-Staende:");
System.out.println(kfz1.getMarke() + ": " + kfz1.getKmStand() + " km");
System.out.println(kfz2.getMarke() + ": " + kfz2.getKmStand() + " km");
kfz1.fahre(-70);
}
}
Das Ausführen der Klasse Verkehr führt zur Konsolenausgabe:
Geplante Fahrtstrecke : 78 km neuer Km-Stand : 78 km --------------------------------- Fahrtvorgang BMW: Geplante Fahrtstrecke : 220 km neuer Km-Stand : 220 km --------------------------------- Fahrtvorgang VW: Geplante Fahrtstrecke : 23 km neuer Km-Stand : 101 km --------------------------------- Fahrtvorgang BMW: Geplante Fahrtstrecke : 65 km neuer Km-Stand : 285 km Versuchte Manipulation des km-Stands Aktuelle km-Staende: VW: 101 km BMW: 100 km --------------------------------- Fahrtvorgang VW: Geplante Fahrtstrecke : -70 km neuer Km-Stand : 31 km
Man sieht, dass die Methoden zwar korrekt arbeiten, aber es sind noch logische Fehler im Programm:
kfz2.setKmStand(100)
: Der km-Stand kann einfach so zurückgesetzt werden. Das ist eine unzulässige Manipulation.kfz1.fahre(-70)
: Man kann negative Fahrtstrecken ausführen. Das ist unsinnig und führt ebenfalls zu einem (unzulässigen) Zurückstellen des km-Stands.
Im nächsten Abschnitt werden wir diese Fehler korrigieren.