Zum Hauptinhalt springen

Woche 6: Stack, Rekursion & eigene Klassen

Nach dieser Woche können Sie …

  • erklären, welche Daten im Heap/Stack gespeichert werden.
  • die Semantik von = erklären.
  • Methoden schreiben, die übergebene Objekte (nicht) verändern.
  • rekursive Definitionen von Funktionen in Methoden übersetzen.
  • die Funktionalität einer gegebenen rekursiven Methode erklären.
  • eigene Klassen mit Instanz-Methoden und -Variablen definieren.
  • Getter und Setter für Instanz-Variablen schreiben.
  • die String-Repräsentation eines Objekts mit toString definieren
  • Konstanten als Klassen-Variablen definieren.

Wenn wir nachvollziehen können, wo Java welche Daten im Arbeitsspeicher (RAM) speichert, können wir besser verstehen, wie sich == und equals verhalten und was bei der Verwendung von = und der Übergabe von Parametern an Methoden passiert (und warum wir aufpassen müssen, wenn wir Parameter, die Objekte sind, verändern).

Rekursion ist eine Problemlösungstechnik, die uns später, wenn wir über Baumstrukturen sprechen werden, wieder begegnen wird. Übrigends kann jede Schleife auch durch Rekursion ausgedrückt werden – es gibt sogar Programmiersprachen, die haben gar keine Schleifen, sondern nur Rekursion (z. B. Prolog und Haskell – die Sprachen sind aber speziell darauf optimiert und haben dann nicht die Nachteile, die wir für Java besprochen haben).

Das Schreiben eigener Klassen und erstellen von Objekten ist elementarer Bestandteil der Objekt-orientierten Programmierung. Sie werden in den folgenden Wochen und im Programmierpraktikum noch ganz viel darüber lernen, wie Klassen gestaltet werden müssen, damit Sie in einem größeren Softwareprojekt übersichtlichen, verständlichen Code erhalten können.

Literatur

Falls Sie die Themen dieser Woche nochmal in der Literatur nachlesen wollen, können Sie sich die Kapitel 2.7.13 (Rekursion & Stack), 6.1, 6.2 (ohne 6.2.7), 6.3, 6.4.1, 6.5.1–6.5.3 und 6.6.1 (Klassen) in Java ist auch eine Insel ansehen.

Vorlesung

Stack & Rekursion

Schreiben eigener Klassen

Freiwillige Zusatzaufgaben

Ergänzen Sie die Klasse Point2D und testen Sie die Änderungen in der main-Methode der Klasse Points:

  • Erweitern Sie die Setter, sodass Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY und Double.NaN nicht an x und y zugewiesen werden können.
  • Fügen Sie eine Objekt-Methode public void add(Point2D otherPoint) hinzu, du zum aktuellen Punkt (this) die Koordinaten des anderen Punktes addiert.
  • Ändern Sie add und subtract so ab, dass nicht die aktuelle Instanz (this) verändert wird, sondern stattdessen eine neue Point-Instanz mit den berechneten Koordinaten zurückgegeben wird.
Berühmte Persönlichkeiten der Informatik

Der Niederländer Edsgar Dijkstra lebte bis 2002 und hat wesentlich zur Entwicklung von Programmiersprachen und anderen Gebieten der Informatik beigetragen. Er hat den Dijkstra-Algorithmus zur Berechnung von kürzesten Wegen erfunden, der z. B. für Navigationssoftware relevant ist (mehr dazu im Wahlplfichtmodul Graphenalgorithmen). Den Algorithmus hat er damals in einem 2½-seitigen Paper veröffentlicht.

Außerdem hat er sich mit nebenläufiger Programmierung befasst und eine erste Formulierung des Dining Philosophers Problems geschaffen. Weiterhin hat er sich mit der formalen Verfikation der Korrektheit von Programmen beschäftigt, was beispielsweise für die Steuersoftware von U-Bahnsystemen wichtig ist (mehr dazu in der Master-Vorlesung Sicherheitskritische Systeme).

Dijkstra hat die Programmiersprache ALGOL 60 (erschienen 1960) mitentwickelt, die als einer der ersten Sprachen Rekursion unterstützt hat. (zum Vergleich: Die Sprache C erschien 1972, Java 1995.) Unter anderem dafür hat er 1972 den Turing Award erhalten.

Es gibt einige berühmte Zitate von Dijkstra:

Programming is one of the most difficult branches of applied mathematics […].

The question of whether Machines Can Think […] is about as relevant as the question of whether Submarines Can Swim.

Simplicity is prerequisite for reliability.

Computer Science is no more about computers than astronomy is about telescopes. (disputed – unklar, ob es wirklich von ihm stammt)

Video zu Dijkstra von Prof. Harmeling (Login in Mediathek erforderlich)

Foto von Dijkstra

Bild: Hamilton Richards, Edsger Wybe Dijkstra, CC BY-SA 3.0