6. Die Subklasse Pkw

Die KLasse Pkw ist eine Subklasse von Kfz. Das wird in der Klassendefinition durch das Schlüsselwort extends festgelegt.

public class Pkw extends Kfz {...

Attribute

Pkw erhält 2 Attribute: sitzplaetze speichert die Anzahl der Sitzplätze im Auto, mitfahrer speichert die Anzahl der Personen, die im Auto sitzen. Beide Attribute sind natürlich vom Typ int.

public class Pkw extends Kfz {
  
  private int sitzplaetze;
  private int mitfahrer;

Konstruktor

Der Konstruktor benötigt alle Parameter, die auch der Konstruktor von Kfz braucht, plus den Parameter sitzplaetze.

Als erstes wird der Konstruktor der Superklasse mit dem Schlüsselwort super() aufgerufen. Die im Kfz-Konstruktor benötigten Parameter-Werte marke, tankMax und verbrauch werden einfach an super() "durchgereicht".

Danach werden die Pkw-eigenen Attribute sitzplaetze und mitfahrer gesetzt. mitfahrer ist zu Anfang immer 0, ein neu erzeugtes Pkw-Objekt ist zu Beginn also leer.

Zum Schluss wird noch eine Information ausgegeben, damit man sieht, dass ein Objekt der Klasse Pkw mit einer bestimmten Sitzplatz-Anzahl erstellt wurde:

public Pkw(String marke, int tankMax, double verbrauch, int sitzplaetze) {
  super(marke, tankMax, verbrauch);
  this.sitzplaetze = sitzplaetze;
  this.mitfahrer = 0;
  System.out.println("(Typ PKW, " + sitzplaetze + " Sitzplaetze)");
}

Getter und Setter

Das Attribut sitzplaetze wird mit dem Aufruf des Konstruktors für ein Objekt festgelegt und kann nicht mehr geändert werden. Deshalb erhält sitzplaetze nur die Getter-Methode.

Das Attribut mitfahrer muss sowohl gelesen als auch geändert werden können und erhält deshalb einen Getter und einen Setter.

public int getSitzplaetze() {
  return this.sitzplaetze;
}

public int getMitfahrer() {
  return this.mitfahrer;
}

public void setMitfahrer(int mitfahrer) {
    this.mitfahrer = mitfahrer;
}

Die Methode einsteigen()

Die Methode einsteigen() bewirkt, dass eine bestimmte Anzahl Personen in das Pkw-Objekt einsteigen. Die Anzahl der Personen wird im Parameter personen festgelegt. Dadurch wird die Anzahl der Mitfahrer erhöht. Das Attribut mitfahrer muss also aktualisiert werden.

Zum Schluss wird die neue Anzahl der Mitfahrer ausgegeben.

public void einsteigen(int personen) {
  System.out.println("---------------------------------");
  System.out.println("Einsteigevorgang " + this.marke + ":");
  System.out.println("Einsteiger            : " + personen);
  
  this.mitfahrer += personen;
  
  System.out.println("Mitfahrer aktuell     : " + this.mitfahrer);
}

Klasse Verkehr

In der Klasse Verkehr wird die neue Subklasse ausprobiert:

Zuerst wird ein Pkw-Objekt erzeugt.
Dann werden die geerbten Methoden tanke() und fahre() an dem Objekt aufgerufen.
Zum Schluss wird 3 mal die Pkw-Methode einsteigen() aufgerufen.

public class Verkehr {  
  public static void main(String[] args) {    
    Pkw pkw1 = new Pkw("Audi", 60, 5, 5);
    pkw1.tanke(20);
    pkw1.fahre(250);
    pkw1.einsteigen(2);
    pkw1.einsteigen(4);
    pkw1.einsteigen(-10);
  }
}

Ausführen der Klasse Verkehr führt zur Konsolenausgabe:

---------------------------------
Objekterstellung Audi
(60 Liter-Tank, Verbrauch 5.0 Liter auf 100 km)
(Typ PKW, 5 Sitzplaetze)
---------------------------------
Tankvorgang Audi:
Maximale Tankmenge    : 60.0 Liter
Gewuenschte Tankmenge : 20 Liter
Getankt               : 20 Liter
neuer Tankstand       : 20.0 Liter
---------------------------------
Fahrtvorgang Audi:
Tankstand             : 20.0 Liter
Maximale Fahrtstrecke : 400.0 km
Geplante Fahrtstrecke : 250 km
Streckenverbrauch     : 12.5 Liter
neuer Km-Stand        : 250 km
neuer Tankstand       : 7.5 Liter
---------------------------------
Einsteigevorgang Audi:
Einsteiger            : 2
Mitfahrer aktuell     : 2
---------------------------------
Einsteigevorgang Audi:
Einsteiger            : 4
Mitfahrer aktuell     : 6
---------------------------------
Einsteigevorgang Audi:
Einsteiger            : -10
Mitfahrer aktuell     : -4

Die geerbten Methoden funktionieren wie gewohnt.

Die neue Methode einsteigen() kann wie gewünscht auf das Attribut marke der Superklasse zugreifen (zu sehen an der Überschrift "Einsteigevorgang ... "). Allerdings nimmt die Methode auch unzulässige Werte an: beim zweiten Aufruf von einsteigen() steigen 4 Personen ein. Dadurch wird  der Wert des Attributs mitfahrer größer als sitzplaetze. Beim dritten Aufruf von einsteigen() wird eine negative Personenzahl angegeben.

Dies sind wieder logische Fehler im Programm, die im nächsten Schritt korrigiert werden.