Inhaltsverzeichnis

Konstruktoren und Vererbung

(A1) Ausprobieren

Experimentiere zunächst mit der Vorlage von https://codeberg.org/qg-info-unterricht/school-net-qg-v2. Die Vorlage enthält eine Version des NewsFeeds, in der Vererbung wie bisher besprochen implementiert ist.

Die Diagramme in der BlueJ-Oberfläche zeigen die Vererbungsbeziehungen an.

Superklasse

Der Konstruktor der Superklasse initialisiert die in der Superklasse festgelegten Attribute:

public class Beitrag
{
    private String username;
    private long timestamp;
    private int likes;
    private ArrayList<String> comments;
 
    /**
     * Initialisiere die Felder von Beitrag
     */
    public Beitrag(String author)
    {
        username = author;
        timestamp = System.currentTimeMillis();
        likes = 0;
        comments = new ArrayList<>();
    }
 
    // weitere Methoden
}

Was macht der Konstruktor einer abgeleiteten Klasse?

Bei der Instanziierung eines Objekts einer abgeleiteten Klasse wird zunächst immer der Konstruktor der abgeleiteten Klasse aufgerufen.

Problem: Auch der TextBeitrag hat einen Autor – bei der Instanziierung eines TextBeitrags muss also das von der Superklasse geerbte Attribut username mit dem Parameter author initialisiert werden, aber wie?

public class TextBeitrag extends Beitrag
{
    private String message;
 
    /**
     * Konstruktor fuer TextBeitrag-Objekte
     */
    public TextBeitrag(String author, String text)
    {
        // PROBLEM: username muss irgendwie auf author
        // gesetzt werden?!
 
        // das ist klar.
        message = text;
    }
 
    // methods omitted
}

Lösung: Der Konstruktor der abgeleiteten Klasse ruft immer den Konstruktor der Superklasse auf: super(…parameter…); So werden alle geerbten Attribute initialisisert, wenn ein Objekt der abgeleiteten Klasse instanziiert wird.

Achtung: Wenn der super-Aufruf nicht explizit angegeben wird, wird super implizit ohne Argumente aufgerufen!

Zusammenfassung

  • Die Konstruktoren abgeleiteter Klassen müssen immer einen Aufruf des Konstruktors der Superklasse (super) beinhalten.
  • Wenn der Programmierer keinen super-Aufruf in seinen Code einfügt, macht das der Compiler. Dann wird super ohne Parameter aufgerufen – das geht schief, wenn der Konstruktor der Superklasse Parameter benötigt.
  • Der super-Aufruf muss das erste Statement im Konstruktor der abgeleiteten Klasse sein.

Material

FilenameFilesizeLast modified
03_vererbung_konstruktor.odp46.0 KiB10.11.2021 20:41
03_vererbung_konstruktor.pdf106.8 KiB10.11.2021 20:41