Java Grundlagen Schulung – Kursbezug
Ziel dieses Kapitels: Sie können Gemeinsamkeiten in eine Basisklasse ziehen (extends),
Methoden sinnvoll überschreiben (override) und mit super Basisklassenlogik wiederverwenden.
Worum geht’s?
- is-a statt „hat-a“: Vererbung nur bei echter Spezialisierung (z.B. OnlineKurs ist ein Kurs).
extendsübernimmt Felder/Methoden, Kindklasse kann erweitern.- override: Kindklasse überschreibt Verhalten (z.B. Ausgabe/Regel) – optional mit
super. protected: sichtbar für Unterklassen, aber nicht für „alle“ wiepublic.
Lehr-Lernziele
- LZ1: entscheiden, wann Vererbung sinnvoll ist (is-a) – und wann nicht (hat-a).
- LZ2: eine Basisklasse erstellen und mit
extendsspezialisieren. - LZ3: Methoden überschreiben und
@Overridekorrekt einsetzen. - LZ4:
superfür Konstruktor & Basismethoden nutzen (Code-Wiederverwendung).
Wie Ziele erreicht werden: Beispiele zeigen „Basisklasse Kurs“ + Spezialisierungen (LZ2), Quiz prüft is-a/override/super (LZ1–LZ4), Mini-Projekt baut zwei Kurs-Typen mit überschriebenen Regeln/Ausgaben (LZ2–LZ4).
is-a vs. hat-a
is-a (Vererbung passt)
- OnlineKurs ist ein Kurs →
class OnlineKurs extends Kurs - PraesenzKurs ist ein Kurs →
extends
hat-a (Komposition passt besser)
- Kurs hat einen Trainer → Feld
Trainer trainer;(keine Vererbung) - Kurs hat einen Ort → Feld
String ort;(kein „Ort extends Kurs“)
Basisklasse + Spezialisierung (extends)
// Basisklasse
class Kurs {
protected String name;
protected int dauerTage;
protected double preis; // Beispielwert
Kurs(String name, int dauerTage, double preis) {
this.name = name;
this.dauerTage = dauerTage;
this.preis = preis;
}
// Basisausgabe
public void druckeInfo() {
System.out.println(name + " | " + dauerTage + " Tage | Preis (Beispiel): " + preis + " €");
}
// Basiregel (kann überschrieben werden)
public double endpreis() {
return preis; // Standard: kein Rabatt
}
}
// Spezialisierung: Online
class OnlineKurs extends Kurs {
OnlineKurs(String name, int dauerTage, double preis) {
super(name, dauerTage, preis); // Konstruktor der Basisklasse
}
@Override
public double endpreis() {
// Beispielregel: Online & Dauer >= 3 => 10%
boolean rabatt = dauerTage >= 3;
return preis * (rabatt ? 0.90 : 1.0);
}
@Override
public void druckeInfo() {
super.druckeInfo(); // Basisteil
System.out.println("Format: Online | Ort: remote");
}
}
// Spezialisierung: Präsenz
class PraesenzKurs extends Kurs {
private String ort;
PraesenzKurs(String name, int dauerTage, double preis, String ort) {
super(name, dauerTage, preis);
this.ort = ort;
}
@Override
public void druckeInfo() {
super.druckeInfo();
System.out.println("Format: Praesenz | Ort: " + ort);
}
}
public class VererbungDemo {
public static void main(String[] args) {
Kurs k1 = new OnlineKurs("Java Grundlagen Schulung", 3, 1490.00);
Kurs k2 = new PraesenzKurs("Java Grundlagen Schulung", 3, 1490.00, "Hamburg");
k1.druckeInfo();
System.out.println("Endpreis (Beispiel): " + k1.endpreis() + " €");
System.out.println("---");
k2.druckeInfo();
System.out.println("Endpreis (Beispiel): " + k2.endpreis() + " €");
}
}Polymorphie: gleiche Schnittstelle, anderes Verhalten
Der Clou: Variable vom Typ Kurs kann auf OnlineKurs oder PraesenzKurs zeigen.
Beim Aufruf von endpreis() / druckeInfo() gilt die überschriebene Version der Kindklasse.
public class PolymorphieKurz {
public static void main(String[] args) {
Kurs[] kurse = new Kurs[] {
new OnlineKurs("Java Grundlagen Schulung", 3, 1490.00),
new PraesenzKurs("Java Grundlagen Schulung", 2, 990.00, "Hamburg")
};
for (Kurs k : kurse) {
k.druckeInfo();
System.out.println("Endpreis (Beispiel): " + k.endpreis() + " €");
System.out.println("---");
}
}
}Praxisaufgabe (Mini)
Sie bauen eine Basisklasse und zwei Spezialisierungen – inklusive überschriebenem Verhalten.
Beitrag zu den Lehr-Lernzielen: LZ2 (extends), LZ3 (override), LZ4 (super), plus Entscheidungsregel LZ1 (is-a vs. hat-a) beim Modellieren.
- Basisklasse
Kurs: Feldername,dauerTage,preis; MethodedruckeInfo()undendpreis(). - Kindklasse
OnlineKurs: überschreibtendpreis()(Beispiel: 10% bei Dauer ≥ 3) und ergänzt Ausgabe. - Kindklasse
PraesenzKurs: hat zusätzlichortund ergänzt Ausgabe. - Test: Array vom Typ
Kurs[]anlegen und alle Kurse per Schleife ausgeben.
Lösung anzeigen
class Kurs {
protected String name;
protected int dauerTage;
protected double preis;
Kurs(String name, int dauerTage, double preis) {
this.name = name;
this.dauerTage = dauerTage;
this.preis = preis;
}
public void druckeInfo() {
System.out.println("Kurs: " + name + " | Dauer: " + dauerTage + " Tage");
}
public double endpreis() {
return preis;
}
}
class OnlineKurs extends Kurs {
OnlineKurs(String name, int dauerTage, double preis) {
super(name, dauerTage, preis);
}
@Override
public double endpreis() {
return preis * (dauerTage >= 3 ? 0.90 : 1.0); // 10% Beispiel
}
@Override
public void druckeInfo() {
super.druckeInfo();
System.out.println("Format: Online | Ort: remote");
System.out.println("Preis (Beispiel): " + endpreis() + " €");
}
}
class PraesenzKurs extends Kurs {
private String ort;
PraesenzKurs(String name, int dauerTage, double preis, String ort) {
super(name, dauerTage, preis);
this.ort = ort;
}
@Override
public void druckeInfo() {
super.druckeInfo();
System.out.println("Format: Praesenz | Ort: " + ort);
System.out.println("Preis (Beispiel): " + endpreis() + " €");
}
}
public class MiniProjektVererbung {
public static void main(String[] args) {
Kurs[] kurse = new Kurs[] {
new OnlineKurs("Java Grundlagen Schulung", 3, 1490.00),
new PraesenzKurs("Java Grundlagen Schulung", 3, 1490.00, "Hamburg")
};
for (Kurs k : kurse) {
k.druckeInfo();
System.out.println("---");
}
}
}Optional: typische Stolperfallen
- Falsches Modell: Vererbung nur bei is-a (nicht bei „hat-a“).
- @Override vergessen: hilft, Tippfehler zu erkennen (Compiler warnt sonst nicht immer sinnvoll).
- super(...) nicht aufgerufen: in Kindkonstruktoren muss Basiskonstruktor passen.
- private Felder in Basis: Unterklassen kommen nicht ran – ggf.
protectedoder Getter.
Kurz-Takeaways
- LZ1: Vererbung nur bei echtem is-a.
- LZ2:
extendsübernimmt Basis, Spezialisierung erweitert. - LZ3:
@Overrideüberschreibt Verhalten – Polymorphie macht’s mächtig. - LZ4:
superfür Basiskonstruktor und Wiederverwendung von Basislogik.