Verkettete Liste Node c c.item c.next Übung zur VL „Grundlagen der Übung zur VL Grundlagen der Programmierung“ g g = new Node(); = "Carol"; Carol ; = null; Node b = new Node(); b.item = "Bob"; b.next = c; Node a a.item a next a.next Node a Node b Node c = new Node(); = "Alice"; = b; C4 CA C0 9. Übung 9. Übung Dr. Zubow a b c Alice i Bob Carol null ll addr Value C0 "Carol" C1 null C2 C3 C4 "Alice" C5 CA C6 C7 C8 C9 CA "Bob" CB C0 CC CD CE CF Hauptspeicher Traversierung einer verketteten Liste Null‐terminierte und zirkulär verkettete Liste first N ll Null‐terminierte i i verkettete k Li Liste Im Falle einer null‐terminierten verketteten Liste: for (List x = first; x != null; x = x.next) { System out println(x name); System.out.println(x.name); } first zirkulär verkettete Liste x first Alice Bob Carol null % java List Alice Bob Carol Traversierung einer verkettete Liste Im Falle einer zirkulär verketteten Liste Löschen & Einfügen & Einfügen Löschen if (first != null) { // if list is not empty x = first; do { System out println(x name); System.out.println(x.name); x = x.next; } while (x != first); } Alice y z x y z x y x y Einfügen x first x Bob % java List Alice Bob Carol Carol Invertieren einer verketteten Liste t Binärer Baum in Java Baum in Java Java Implementierung eines binären Baums von Strings Java Implementierung von Strings Invertieren reverse first second – Eine Referenz auf einen String. – Eine Referenz auf den linken Tree. – Eine Referenz auf den rechten Tree. public class Tree { private String s; private Tree left; private Tree right; } Verkettete Strukturen • • Reale Welt Modell Abstraktion Jede der 3 Methoden f(), g() bzw. h() ist dazu geeignet, eine oder mehrere der Datenstrukturen A,B,C,D nach einem Wert key zu durchsuchen. Bestimmen sie zu jeder der Datenstrukturen A,B,C,D jeweils die Funktion (f(), g(), oder h()),die zum Durchsuchen dieser Datenstruktur und dem yg g sind. Auffinden des Wertes key geeignet Der Hilfs‐Typ Node ist wie folgt definiert: public class Node { public int key; public Node left, right; } public boolean f(int key) { Node x = start; while hil (x != null) ( ! ll) { if (x.key == key) return true; x = x.right; } return false; } public boolean g(int key) { Node x = start; while hil (x != null) ( ! ll) { if (x.key == key) return true; if (x.key > key) x = x.left; else x = x.right; } return false; } public boolean h(int key) { Node x = start; while hil (true) (t ) { x = x.right; if (x.key == key) return true; if (x == start) break; } return false; } Schnappi (20kg launisch): Hund Schnappi (20kg, launisch): Hund Munchkin (1kg, langsam): Schildkröte Kitty (8kg, schläfrig): Katze Reale Entitäten Instanzenmodell Klassifikation Klassifikation Abstraktion Tier + name + gewicht Katze + reinlich reinlich Hund + sabbert sabbert Schildkröte + speed speed Objekte in Java Objekte in Java Java Collections Java Collections • Beziehungen zwischen Klassen – – – – Vererbung (inheritance relationships) Schnittstellen (interfaces) ( ) Packaging I Innere Klassen (inner Kl (i classes) l ) • Subklassen und Vererbung Collection = represents a group of objects, known as its elements. Set = A collection that contains no duplicate elements. List = An ordered collection (also known as a sequence). Map = An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value. at most one value. SortedMap = A map that further guarantees that it will be in ascending key order, sorted according to the natural ordering of its keys. – Kl Klassen in Java liegen in einer Klassenhirarchie i J li i i Kl hi hi vor – Ein Klasse kann als Subklasse einer anderen Klassen mit Hilfe des Schlüsselwortes extends deklariert werden des Schlüsselwortes extends deklariert werden – Eine Subklasse erbt Variablen und Methoden der Superklasse und kann diese verwenden, als wären sie selbst in der Subklasse deklariert Objekte in Java Objekte in Java • Subklassen und Vererbung class Animal { float weight; void eat() { ... } } class Mammal extends Animal { // Säugetier int heartRate; // inherits weight ... void breathe() () { // atmen ... } // i inherits h it eat() t() } Objekte in Java Objekte in Java • Subklassen und Vererbung – Eine Katze ist vom Typ Säugetier, welches wiederum vom Typ Tier ist – Objekte vom Typ Katze erben alle Charakteristiken von Objekten des Typs Säugetier und Tier b k d d – Eine Katze besitzt jedoch zusätzliche Eigenschaften (p rr() Methode und longHair Variable) (purr()‐Methode und longHair‐Variable) Animal Mammal Cat Klassenhierarchie Objekte in Java Objekte in Java • Subklassen und Vererbung – Eine Klasse kann max. eine andere erweitern (single inheritance) Æ Lösung über Interfaces (später) inheritance) Æ Lösung über Interfaces (später) – Eine Klasse kann ferner weiter erweitert werden (Vererbung als Spezialisierung) als Spezialisierung) class Cat extends Mammal { boolean longHair; // inherits weight and heartRate ... void p purr() () { // schnurren ... } // i inherits h it eat() t() and d b breathe() th () } Objekte in Java Objekte in Java • Subklassen und Vererbung – Eine Subklasse erbt alle Elemente (Variablen/ Methoden) der Superklasse (Ausnahme: private deklarierte Elemente) – Instanzen des Subtyps können überall dort verwendet d b k b ll d d werden, wo Instanzen des Supertyps erwartet werden: C t simon Cat i = new C Cat(); t() Animal creature = simon; Objekte in Java Objekte in Java • Subklassen und Vererbung • Subklassen und Vererbung – Verdeckte Variablen (shadowed variables) Verdeckte Variablen (shadowed variables) class Animal float weight; class Mammal class Mammal float weight; Inherited scope Instance Instance scope Local scope Objekte in Java Objekte in Java foodConsumption() {{ foodConsumption() float weight; ... weight = ...;; weight } – Verdeckte Variablen (shadowed variables) Verdeckte Variablen (shadowed variables) class IntegerCalculator { int sum; } class l D DecimalCalculator i lC l l t extends t d I IntegerCalculator t C l l t { double sum; ... // Zugriff auf sum der Superklasse int s = super.sum; } Objekte in Java Objekte in Java • Subklassen und Vererbung Objekte in Java Objekte in Java • Subklassen und Vererbung – Verdeckte Variablen (shadowed variables) ( ) class Animal eat() sleep() reproduce() DecimalCalculator dc = new DecimalCalculator(); IntegerCalculator ic = dc; int s = ic.sum; //Zugriff auf IntegerCalculator – Überschriebene Methoden (overriding methods) • SSubklasse kann eine Methode definieren, welche die exakt gleiche bkl k i M h d d fi i l h di k l i h Methodensignatur wie eine Methode in der Superklasse hat • Die Methode in der Subklasse „überschreibt“ die Methode der Superklasse (ersetzt die Implementierung) • Ermöglicht das Verhalten von Objekten zu verändern (Æ Subtyp‐ Polymorphie) overrides overrides class Mammal reproduce() class Cat sleep() l () huntMice() purr() Cat simon eat() reproduce() sleep() huntMice() purr() Objekte in Java Objekte in Java • Subklassen und Vererbung – Überschriebene Methoden (overriding ( g methods)) • Existieren mehrere Implementationen einer Methode in der Vererbungshierarchie eines Objektes, dann wird die M h d d Methode der speziellsten Klasse gewählt i ll Kl ähl – … unabhängig davon, ob über einen weniger speziellen Typ g g zugegriffen wird Cat simon = new Cat(); Animal creature = simon; ... creature.sleep(); // accesses Cat sleep() Objekte in Java Objekte in Java • Subklassen und Vererbung – Überschriebene Methoden Überschriebene Methoden • Werden zur Laufzeit (Æ überladene Methoden zur Compilezeit) ausgewählt • Casting hat einen Einfluss auf die Auswahl von überladenen, nicht aber überschriebenen Methoden • Statische Methoden Statische Methoden werden nicht dynamisch zur Laufzeit werden nicht dynamisch zur Laufzeit ausgewählt (Æ Compilezeit) – eine statische Methode einer Superklasse kann durch eine andere statische M. einer Subklasse üb d kt überdeckt werden (Ausnahme: final) d (A h fi l) • Mit Hilfe von final kann das Überschreiben einer Methode verhindert werden (von final deklarierten Klassen kann hingegen nicht geerbt werden, z.B. java.lang.String) Objekte in Java Objekte in Java • Subklassen und Vererbung – Spezielle Referenzen: this und super • Zugriff auf die Bestandteile des aktuellen Objektes bzw. der Superklasse • super um auf Bestandteile der Superklasse zuzugreifen • Häufiger Anwendungsfall: Überschreibende Methode (der Subklasse) führt einige vorgelagerte Aufgaben durch, bevor sie die auf die überschriebene Methode (der Superklasse) verweist Superklasse) verweist class Animal { void eat(Food f) throws InedibleException { // consume food } } class Herbivore extends Animal { void eat(Food f) throws InedibleException { // check if edible super.eat(f); } } Objekte in Java Objekte in Java • Subklassen und Vererbung – Spezielle Referenzen: this und super • super veranlasst die Suche nach Variablen/Methoden in der veranlasst die Suche nach Variablen/Methoden in der unmittelbaren Superklasse zu beginnen • Die geerbte Variable/Methode kann sich in der unmittelbaren bzw. einer weiter entfernten Superklasse befinden weiter entfernten Superklasse befinden – Casting • Mit Hilfe eines cast wird dem Compiler explizit mitgeteilt, dass der Typ einer Objektreferenz verändert werden soll einer Objektreferenz verändert werden soll • Wird zur Compile‐ und Laufzeitzeit überprüft (Æ ClassCastException) • Lediglich das „casten“ von Objekten der selben Vererbungshierarchie ist erlaubt (Æ Interfacekonzept) erlaubt (Æ • Ein cast hat lediglich Einfluss auf die Referenz – die jeweiligen Objekte bleiben unverändert (es wird lediglich die Sicht des Compilers bzw. der Laufzeit auf ein Objekt verändert) j Objekte in Java Objekte in Java • Subklassen und Vererbung Objekte in Java Objekte in Java • Subklassen und Vererbung – Casting ‐ Einfluss auf Variablen und überladene Methoden – Castingg • Wird benötigt, um den Typ einer Referenz spezieller zu machen: Animal creature = ... Cat simon = ... creature = simon; //OK (-> implicit upcasting) //simon = creature; //Failed //Failed, incompatible types simon = (Cat) creature; //OK (-> downcasting) ((Animal)simon).weight class Animal float weight; class Mammal class Cat float weight; float weight; simon weight simon.weight Objekte in Java Objekte in Java • Subklassen und Vererbung – Casting – kein Einfluss auf überschrieben Methoden class Animal sleep(); class Mammal ((Animal)simon).sleep() simon.sleep() class Cat sleep(); Objekte in Java Objekte in Java • Subklassen und Vererbung – Superklassen‐Konstruktoren • Anweisung super() ruft explizit den Konstruktor der Superklasse auf f l k kl f • Notwendig, da Java implizit nur den Standardkonstruktor aufruft class Person { Person(String name) {...} } class Doctor extends Person { Doctor(String name, String speciality) { super(name); // process additional work } }