Zum Hauptinhalt springen

Woche 10: Generics & Vererbung

Nach dieser Woche können Sie …

  • generische Datentypen erstellen und verwenden
  • Klassen schreiben, die von anderen Klassen erben
  • Polymorphie im Zusammenhang mit Vererbung benutzen
  • Instanzmethoden überschreiben
  • super verwenden, um Methoden der Oberklasse aufzurufen

Generics erlauben es uns, Variablen auf Typebene einzuführen. Dadurch können wir Klassen schreiben, die mit verschiedenen Datentypen umgehen können, aber gleichzeitig behalten wir den Vorteil, dass uns der Compiler warnt, wenn wir Dinge tun, die mit einem Datentypen nicht kompatibel sind. Generics werden Ihnen sehr oft begegnen, wenn Sie mit Datentypen arbeiten, die in Java eingebaut sind. Ein paar davon lernen wir später noch kennen; wer schon etwas im Voraus sehen möchte, kann sich die Expertenvideos anschauen.

Vererbung ist ein zentrales Konzept der Objekt-orientierten Programmierung – tatsächlich haben wir früher schon Vererbung benutzt, ohne dass wir es erklärt haben. Vererbung stellt ähnlich wie Interfaces eine Subtyp-Beziehung her, erlaubt uns aber zusätzlich, in verwandten Klassen auch gleichen Code für Objektmethoden zu haben; dadurch können wir Verhindern, gleichen Code an verschiedenen Stellen zu haben.

Literatur

Falls Sie die Themen dieser Woche nochmal in der Literatur nachlesen wollen, können Sie sich die Abschnitte 11.1.1–11.1.5 (Generics) 7.2 (bis 7.2.4), 7.2.6, 7.3.1, 7.3.2, 7.4.1–3, 7.5.1–3 (Vererbung) und 10.1.2, 10.1.3 (toString und equals) in Java ist auch eine Insel ansehen.

Vorlesung

Generics

Freiwillige Zusatzaufgaben
  • Schreiben Sie die Übungsaufgabe Zulassung (Blatt 8) so um, dass Listen verwendet werden und eine beliebig große Anzahl von Eingabedaten unterstützt wird.
  • nach dem Übungsbesuch: Bearbeiten Sie die Zusatzaufgabe, die Sie im Übungsmaterial im Ordner filter1 finden.
  • zum Knobeln: Schreiben Sie die Listen-Klasse so um, dass ein Dummy-Element (sentinel node) am Anfang und/oder Ende der Liste verwendet wird. Wo wird der Code der Listen-Operationen einfacher? Wo komplizierter?

Vererben & Überschreiben

Evaluationsergebnisse

Vielen Dank für die Teilnahmen an der Lehrveranstaltungs-Evaluation. Falls Sie weitere Verbesserungsvorschläge haben und wir ggf. einen Kommentar von Ihnen Missverstanden haben, melden Sie sich gerne per anonymen Feedback oder Mail bei uns. Die kompletten Ergebnisse als PDF stellen wir hier als PDF zum Download zur Verfügung. (Hinweis: Wir haben auch nicht mehr Daten als die, die im PDF stehen.)

Evaluationsergebnisse
Berühmte Persönlichkeiten der Informatik

John McCarthy hat 1955 als erster den Begriff Künstliche Intelligenz definiert („the science and engineering of making intelligent machines“). Für seine Leistungen im Bereich der KI hat er 1971 den Turing Award erhalten.

Im Rahmen seiner Arbeit hat er viele wichtige Konzepte entwickelt, beispielsweise die Garbage Collection, wie es sie heute auch in Java gibt: Wir müssen – anders als z. B. in der Programmiersprache C – den Speicherplatz für einmal angelegte Objekte nicht manuell freigeben, wenn wir die Objekte nicht mehr brauchen. Die JVM erledigt das automatisch für uns.

Weiterhin hat er die Programmiersprache LISP erfunden, die zweitälteste, heute noch verwendete, höhere Programmiersprache (nach Fortran). Viele Konzepte, die LISP neu eingeführt hat, wie z. B. Funktionen höherer Ordnung (Funktionen, die andere Funktionen als Parameter nehmen oder als Rückgabewert haben), finden immer mehr Verbreitung in aktuellen Sprachen (auch in Java, wie Sie im Programmierpraktikum lernen werden).

Eine LISP-ähnliche Sprache, die auch in der JVM läuft, ist Clojure. Diese Sprache können Sie im Wahlpflichtmodul Funktionale Programmierung lernen. Funktionale Programmierung unterscheidet sich so fundamental von der imperativen Programmierung, wie wir sie bisher kennengelernt haben, dass Sie beim Lernen einer funktionalen Sprache quasi alles vergessen können, was sie bisher über Variablen, Schleifen usw. gelernt haben; im Gegenzug bekommen sie einen spannenden, alternativen Blick, um Probleme programmatisch zu lösen.

Ungewohnt bei den LISP-Sprachen ist die fully paranthesized polish prefix notation: Statt 1 + 2 oder f(1, 2) wird (+ 1 2) und (f 1 2) geschrieben. Die Sprache ist dabei so konzipiert, dass Code und Daten im selben Format aufgeschrieben werden (Homoikonizität), sodass sich der Code leicht zur Laufzeit selbst verändern kann, was im Bereich Künstliche Intelligenz interessant ist.

(defn schaltjahr? [jahr]
(cond (zero? (mod jahr 400)) true
(zero? (mod jahr 100)) false
(zero? (mod jahr 4)) true
:default false))

Video über McCarthy und LISP