faecher:informatik:oberstufe:modellierung:vererbung:konstruktoren:start

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.

  • Öffne den Quelltext der Klasse TextBeitrag() und entferne "extends Beitrag" in der Klassendefinition. Übersetze die Klasse erneut. Welche Veränderung beobachtest du am Klassendiagramm? Füge anschließend "extends Beitrag" wieder ein.
  • Erzeuge ein TextBeitrags-Objekt. Rufe einige seiner Methoden auf. Kannst du auch die geerbten Methoden aufrufen, z.B erfasseKommentar? Was beobachtest du bei den geerbten Methoden?

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
}

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!

  • 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.
FilenameFilesizeLast modified
03_vererbung_konstruktor.odp46.0 KiB10.11.2021 20:41
03_vererbung_konstruktor.pdf106.8 KiB10.11.2021 20:41
  • faecher/informatik/oberstufe/modellierung/vererbung/konstruktoren/start.txt
  • Zuletzt geändert: 12.10.2023 12:22
  • von Svenja Müller