Vorkurs Informatik SoSe18

Ähnliche Dokumente
Vorkurs Informatik WiSe 16/17

Vorkurs Informatik WiSe 17/18

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Vorkurs Informatik WiSe 15/16

Java Grundlagen 2 - OOP

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Vorkurs Informatik WiSe 17/18

Vorkurs Informatik WiSe 16/17

Vorkurs Informatik WiSe 15/16

Programmierung Nachklausurtutorium

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

12 Abstrakte Klassen, finale Klassen und Interfaces

Algorithmen und Datenstrukturen

Vererbung, Polymorphie

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Algorithmen und Datenstrukturen 07

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Objektorientierung (OO)

Fragen zur OOP in Java

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Implementieren von Klassen

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Grundelemente objektorientierter Sprachen (1)

4. Vererbung Die Klasse Object. Die Klasse Object

Grundelemente objektorientierter Sprachen (1)

Einführung in das Programmieren Probeklausur Lösungen

Grundelemente objektorientierter Sprachen (1)

Programmieren in Java

Die abstrakte Klasse Expression:

Vererbung und Polymorphie

Java Vererbung. Inhalt

Propädeutikum Programmierung in der Bioinformatik

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Programmieren 2 Java Überblick

Einführung in die Systemprogrammierung

6. Globalübung (zu Übungsblatt 8)

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Einstieg in die Informatik mit Java

Kapitel 5: Interfaces

Einstieg in die Informatik mit Java

Tafelübung 07 Algorithmen und Datenstrukturen

3 Objektorientierte Konzepte in Java

Fakultät IV Elektrotechnik/Informatik

Das Interface-Konzept am Beispiel der Sprache Java

Polymorphie. 15. Java Objektorientierung II

Polymorphie. 15. Java Objektorientierung II

Programmieren in Java -Eingangstest-

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

7. Übung Informatik II - Objektorientierte Programmierung

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

6 Speicherorganisation

Programmieren in Java

Musterlösung Stand: 5. Februar 2009

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

6 Speicherorganisation

Objektorientierte Programmierung Studiengang Medieninformatik

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

JAVA 05: Objektorientierte Konzepte

II.4.5 Generische Datentypen - 1 -

7. Objektorientierung. Informatik II für Verkehrsingenieure

Modellierung und Programmierung 1

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Objekte und Klassen. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E.

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Objektorientierte Programmierung III

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Abstrakte Basisklassen

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

JAVA - Methoden - Rekursion

Erste Java-Programme (Java Wiederholung & Vererbung)

2. Unterprogramme und Methoden

Programmieren 1 08 Objekte und Interfaces

Programmieren in Java

Informatik II Übung 6

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Objektorientierte Programmierung Studiengang Medieninformatik

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces

Interfaces und Vererbung

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Programmierkurs Java

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung. Kapitel 14: Interfaces

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Einführung in die Programmierung

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Transkript:

Vorkurs Informatik SoSe18 Java Methoden Dr. Werner Struckmann / Maximilian von Unwerth, 27.03.2018

Einleitung Rekursion Übung Objektorientierung OOP mit Java Vererbung Weitere Beispiele 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 2

Rekursion Rekursion ist ein wichtiges Prinzip bei der Formulierung von Algorithmen. Es beschreibt die wiederholte Anwendung des gleichen Berechnungsmusters, allerdings i. d. R. auf immer einfachere Daten. Definition Ein rekursives Programm ist ein Programm, das sich selbst aufruft. Meist enthält es eine Abbruchbedingung zur Beendigung der Rekursion. 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 3

Rekursion Bisher wurden Wiederholungen durch Schleifen gelöst Aber nicht alle Probleme lassen sich nur mit Schleifenlösen Außerdem viele Algorithmen benutzen das divide and conquer-prinzip Fakultät n! = n (n 1)... 2 1 Potenzierung a n = a n 1 a, a 0 = 1 Fibonacci-Funktion, Binomialkoeffzient, ggt, mod Such- und Sortierprobleme (z.b. in AuD) 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 4

Klassifikation rekursiver Situationen Rekursive Definitionen umfassen i. d. R. mindestens 2 Fälle: Basisfall (Abbruch der Rekursion) Rekursionsschritt (rekursive Definition) Was ist was? 1 public static int fak(int n) { 2 if (n <= 1) { 3 return 1; 4 } 5 return n * fak(n - 1); 6 } 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 5

Vor- und Nachteile Vorteile: Mathematische Definition divide and conquer-prinzip Leichter lesbar und verständlicher für den Menschen Fehler bleiben lokal leichteres Debuggen Nachteile: Fehlendes Verständnis führt zur Endlosrekursion Auch bei korrekter Arbeitsweise kann ein Stack Overflow auftreten Horror für die CPU! 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 6

1. Beispiel Gegeben sei die folgende rekursive Methode: 1 static int f(int x, int y) { 2 if (x == 1) 3 return 3; 4 else if (y <= 4) 5 return 1; 6 else 7 return 3 * f(x - 2, y - 3) - 2 * f(x - 2, y); 8 } Welchen Wert liefert der Aufruf f(9,7)? In welcher Reihenfolge und mit welchen Parametern wird f dabei aufgerufen? Geben Sie die Reihenfolge der Aufrufe explizit an. Wie groß ist die maximale Rekursionstiefe, d. h. die maximale Anzahl gleichzeitig aktiver Aufrufe? Terminiert für alle x 0, y 0 der Aufruf f(x,y) mit der Rückgabe eines int-wertes? Begründen Sie Ihre Antwort. 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 7

Lösung vom 1. Beispiel f (9, 7) f (7, 4) f (7, 7) 1 f (5, 4) f (5, 7) 1 f (3, 4) f (3, 7) 1 f (1, 4) f (1, 7) f (9, 7) = 15 und Rekursionstiefe ist 5 Terminiert die Rekursion immer? 3 3 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 8

2. Beispiel Gegeben sei die folgende rekursive Methode: 1 static int f(int x, int y) { 2 if (x <= 1) { 3 return 2; 4 } else if (y <= 0) { 5 return 1; 6 } else 7 return 2 * (f(x + 1, y - 3) - f(x - 3, y)) + 1; 8 } Welchen Wert liefert der Aufruf f(5,4)? In welcher Reihenfolge und mit welchen Parametern wird f dabei aufgerufen? Geben Sie die Reihenfolge der Aufrufe explizit an. Wie groß ist die maximale Rekursionstiefe, d. h. die maximale Anzahl gleichzeitig aktiver Aufrufe? Terminiert für alle x 0, y 0 der Aufruf f(x,y) mit der Rückgabe eines int-wertes? 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 9

Lösung vom 2. Beispiel Einleitung Rekursion Übung Objektorientierung OOP mit Java Vererbung Danke Weitere Beispiele Aufruf f (x, y) 1 f (5, 4) f (5, 4) 2 f (6, 1) 3 f (7, 2) f (6, 1) f (2, 4) 4 f (3, 1) 5 f (4, 2) 6 f (0, 1) f (7, 2) f (3, 1) f (3, 1) f ( 1, 4) 7 f (2, 4) 8 f (3, 1) 1 f (4, 2) f (0, 1) f (4, 2) f (0, 1) 2 9 f (4, 2) 10 f (0, 1) 1 2 1 2 11 f ( 1, 4) f (5, 4) = 21 und Rekursionstiefe ist 4 Terminiert die Rekursion immer? 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 10

3. Beispiel Gegeben sei die folgende rekursive Methode: 1 static int f(int x, int y) { 2 if (x == 1) 3 return y - 1; 4 else 5 if (x == y) 6 return f(1, y); 7 else 8 return f(x % 2, f(x - 2, y + 1) + 2); 9 } Welchen Wert liefert der Aufruf f(11,5)? In welcher Reihenfolge und mit welchen Parametern wird f dabei aufgerufen? Geben Sie die Reihenfolge der Aufrufe explizit an. Wie groß ist die maximale Rekursionstiefe, d. h. die maximale Anzahl gleichzeitig aktiver Aufrufe? Terminiert für alle x 0, y 0 der Aufruf f(x,y) mit der Rückgabe eines int-wertes? 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 11

Lösung vom 3. Beispiel f (11, 5) Aufruf f (x, y) 1 f (11, 5) 2 f (9, 6) 3 f (7, 7) 4 f (1, 7) 5 f (1, 8) 6 f (1, 9) f (9, 6) f (7, 7) f (1, 8) f (1, 7) 7 f (1, 9) 8 6 f (11, 5) = 8 und Rekursionstiefe ist 4 (der Aufrufbaum ist leider nicht besser darstellbar) Terminiert die Rekursion immer? 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 12

Objektorientierung Spezifikation GUI mit Star Trek und Star Wars Symbolen Klick auf Symbol: Drehen um 360 Pro Symbol bestimmte Titelmelodie abspielen Zwei Programmierer: Larry (prozedural)und Brad (objektorientiert) Wer zuerst liefert, bekommt einen neuen Bürostuhl.

Die erste Version Larry überlegt sich: Was muss das Programm machen? rotate und playsound welche auf Formen reagieren rotate(shapenum) { //Rotiere Form um 360 Grad } playsound(shapenum) { // Prueft, welche Musik zum Symbol gehoert // Spiele Datei ab } Brad überlegt sich: Welche Dinge tauchen im Programm auf? Formen, welche etwas ausführen rotate und playsound class StarWars { rotate() { //Drehe ein Symbol } playsound() { //Spiele Musik fuer Star Wars ab } } class StarTrek { rotate() { //Drehe ein Symbol } playsound() { //Spiele Star Trek Melodie } }

Aber... Larry wird als erster fertig. Aber jetzt gibt es eine Änderung der Spezifikation: Erweiterung der Spezifikation Neues Symbol für Fans von The Expanse Sounddatei für The Expanse 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 15

Die zweite Version Larry passt die playsound an (+)Schnell (-)Muss getesteten Code ändern! (-)Unübersichtlich 1 playsound(shapenum) { 2 if (/*Form ist kein The Expanse Symbol*/) { 3 // Prueft, welche Musik zur Form gehoert 4 // Spiele Datei ab 5 } else { 6 //Spiele The Expanse Sounddatei ab 7 } 8 } Brad erstellt eine neue Klasse (+)Übersichtlich (+)Lokale Änderungen (-)Muss Code kopieren! (-)Langsam 1 class TheExpanse { 2 rotate() { 3 //Drehe The Expanse 4 } 5 playsound() { 6 //Spiele Musik fuer The Expanse ab 7 } 8 } 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 16

Der Projektmanager schlägt wieder zu Larry wird wieder als erster fertig. Aber es noch gibt eine Änderung der Spezifikation: Änderung der Spezifikation The Expanse Symbol soll sich nicht nur um Mittelpunkt, sondern um einen frei wählbaren Punkt drehen. 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 17

Die dritte Version Larry muss die Definition ändern. (-)Anpassen jedes Aufrufs von rotate! (-)Führt schnell zu Fehlern (-)Unübersichtlich 1 rotate(int x, int y, Shape symbol) { 2 if (/*Form ist kein The Expanse Symbol*/) { 3 //Rotiere um Box -Mittelpunkt 4 } else { 5 //Werde groesser 6 } 7 } Brad passt die Klasse an. (+)Lokale Änderungen (+)Übersichtlich (+)Schnell 1 class TheExpanse { 2 int rotx; 3 int roty; 4 rotate() { 5 //Drehe Symbol um Punkt x, y 6 } 7 playsound() { 8 //Unveraendert 9 } 10 } 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 18

Der Trick mit der Vererbung Verursacht Brads OOP Ansatz doppelten Code zwischen den Methoden? Nicht unbedingt Auslagern gemeinsamer Eigenschaften in übergeordnete Klasse Vererbung

Noch ein Trick: Überschreiben Nun würden aber alle Formen gleich rotieren Das The Expanse Symbol würde das Verhalten der Elternklasse erben. Methoden können in Unterklassen geändert werden Überschreiben von Methoden

OOP Objekte = Verhalten (durch Methoden) + Daten (durch Attribute) Klassen = Baupläne für Objekte Kapselung von Programmteilen Einfacheres Ändern von Programmen Wiederverwendung von Programmteilen 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 21

Klassen in Java 1 ZugriffsBeschraenker class KlassenName { 2 // Attribute 3 // Methoden 4 } Eine Klasse mit public-zugriffsbeschränker pro.java-datei 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 22

Attribute in Java Attribute beschreiben die Daten, die jedes Objekt speichert Klasse gibt an, welche Attribute Objekte dieser Klasse haben Jedes Objekt verfügt über eine eigene Kopie dieser Attribute Änderungen an den Attributen eines Objektes wirken sich nur auf dieses Objekt aus Attribute sollen fast immer private sein. Werden fast wie lokale Variablen definiert. 1 ZugriffsBeschraenker class KlassenName { 2 Typ attributsname; 3 Typ attributsname = Initialisierungswert. 4 // Methoden 5 }

Methoden Methoden sind die Aktionen, die mit einem Objekt ausgeführt werden können Statische Methoden kennen wir schon Unterschied zu statischen Methoden: Sie arbeiten auf einzelnen Objekten 1 ZugriffsBeschraenker class KlassenName { 2 // Attribute 3 Zugriffsbeschraenker Rueckgabetyp name(t1 Paramter1,...) { 4 // Anweisungen 5 } 6 } 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 24

Zugriffsbeschränker Beschränker erlauben es Elemente nach außen hin zu versteckt. Dies erschwert unsachgemäße Verwendung von Objekten und erleichtert Kapselung. Beschränker Klasse Paket Unterklassen Rest public Y Y Y Y protected Y Y Y N keine Angabe Y Y N N private Y N N N Normalerweise reichen public und private. 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 25

Beispiel: Counter Einleitung Rekursion Übung Objektorientierung OOP mit Java Vererbung Danke Weitere Beispiele 1 public class Counter { 2 private int count; 3 4 public void increase() { 5 count++; 6 } 7 8 public int getcount() { 9 return count; 10 } 11 12 public void reset() { 13 count = 0; 14 } 15 } 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 26

Erzeugen von Objekten Wir können nun selber Klassen erstellen, wie werden diese nun verwendet? new erzeugt neue Objekte Syntax: new Klassenname(Konstruktorparameter) new gibt eine Referenz auf das neue Objekt zurück 1 Counter c = new Counter();

null Nullreferenz Variable von Referenztyp zeigt auf nichts Standardwert von Attributen mit Referenzdatentyp 1 Counter c = null; 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 28

Der. Operator Wir können jetzt neue Objekte erzeugen. Wie benutzt man nun ein Objekt? Der.-Operator kann auf eine Referenz angewendet werden, um auf die Attribute und Methoden des referenzierten Objektes zuzugreifen. Voraussetzung ist, dass der Zugriff erlaubt ist (Beschränker) Syntax: referenz.element 1 Counter c = new Counter(); 2 c.increase(); 3 c.increase(); 4 c.reset(); 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 29

Konstruktoren Oft müssen beim Erzeugen von Objekten Attribute initialisiert werden Vom Benutzer der Klasse zu verlangen, dass er die Attribute selber nach dem Erzeugen setzt, kann zu Fehlern führen Konstruktoren sind Methoden, die beim Erzeugen des Objektes aufgerufen werden. Kein Rückgabetyp, gleicher Name wie Klasse Falls keiner selber definiert: Default Konstruktor ohne Parameter Klassenname() wird automatisch erzeugt Konstruktoren werden nicht vererbt 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 30

Beispiel: Counter 1 public class Counter { 2 private int count; 3 public Counter() { 4 this(1); 5 } 6 public Counter(int start) { 7 count = start; 8 } 9 public void increase() { 10 count++; 11 } 12 public int getcount() { 13 return count; 14 } 15 public void reset() { 16 count = 0; 17 } 18 }

static static markiert Elemente von Klassen als statisch Wird normalerweise hinter dem Zugriffsbeschränker angegeben Für statische Attribute existiert nur eine einzige Kopie, die von allen Objektinstanzen dieser Klasse geteilt wird. Statische Methoden können ohne Objektinstanz genutzt werden, dürfen aber auch nur auf statische Elemente der Klasse zugreifen Nicht-statische Attribute existieren nur für Objektinstanzen, statische Methodenaufrufe operieren auf keinem Objekt Zugriff mit Klassenname.Element 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 32

Überladen von Methoden Mehrere Methoden in einer Klasse können denselben Namen haben Müssen sich in der Parameterliste unterscheiden (durch andere Typen, andere Anzahl von Parametern oder beidem) Rückgabetyp wird nicht zur Unterscheidung herangezogen Auswahl der passenden Methode geschieht zur Kompilierzeit 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 33

final final vor Attributen und lokalen Variablen verhindert das Ändern derer Werte Für Referenztypen heißt dies: Es kann nicht geändert werden, worauf die Referenz zeigt. Das referenzierte Objekt an sich ist jedoch noch veränderbar. final vor Klassen: Von der Klasse kann nicht geerbt werden final vor Methoden: Kein Überschreiben möglich 1 import java.util.*; 2 public class Fin { 3 public static final List <String > l = new ArrayList <>(); 4 public static int ANSWER = 42; 5 6 public static void main(string[] args) { 7 System.out.println(l); 8 // Geht nicht, da l final ist 9 //l = new ArrayList <String >(); 10 // Das referenzierte Objekt selbst kann geaendert werden 11 l.add("test"); 12 System.out.println(l); 13 } 14 } Fin.java

Vererbung in Java Vererbung ermöglicht es, Klassen zu spezialisieren Wiederverwendung vorhandener Klassen Kindsklasse erhält alle Attribute und Methoden der Elternklasse Syntax: class Kindsklasse extends Elternklasse... Objekte der Kindsklasse sind auch Objekte der Elternklasse Kindsklasse kann Methoden ändern (überschreiben), Zugriff auf Version der Elternklasse mit super Jede Klasse hat genau eine direkte Elternklasse, ohne Angabe Object

Ein schneller Counter 1 public class Counter { 2 private int count; 3 4 public Counter(int start) { 5 this.count = start; 6 } 7 8 protected setcount(int count) { 9 this.count = count; 10 } 11 12 public void increase() { 13 count++; 14 } 15 16 public int getcount() { 17 return count; 18 } 19 20 public void reset() { 21 count = 0; 22 } 23 }

Ein schneller Counter Wichtig: Kindsklasse darf nicht auf private Elemente der Elternklasse zugreifen! Wichtig: Konstruktoren werden nicht vererbt! setcount ist protected, damit die Unterklasse, den Counter freier setzen kann Alternativ: Mehrfache Benutzung von increase der Elternklasse 1 public class FastCounter extends Counter { 2 3 public FastCounter(int start) { 4 super(start); 5 } 6 7 public void increase() { 8 setcount(getcount() + 2); 9 } 10 } 1 public void increase() { 2 super.increase(); 3 super.increase(); 4 }

Polymorphie Jedes Objekt einer Kindsklasse ist auch ein Objekt seiner Elternklassen. 1 Counter c = new FastCounter (0); Java löst Methodenaufrufe auf Objekte zur Laufzeit auf 1 c.increase(); // Ruft increase von FastCounter auf, obwohl c eine Counter -Referenz ist 2 System.out.println(c.getCount()); // <- 2 Es wird die Methode des Typs des referenzierten Objektes aufgerufen, nicht die vom Typ der Referenz! Das Objekt selbst weiß, wie es was tun muss

equals Alle Klassen erben von Object Object hat Methode public boolean equals(object o) Ohne Überschreiben wie == Kann in Unterklasse überschrieben werden, um wertmäßig zu vergleichen Da eine Referenz auf ein Object übergeben wird, muss man beim überschreiben auf zwei Sachen achten: null und den richtigen Typ obj instanceof Klasse gibt true zurück, wenn o nicht null ist und ein Objekt vom Typ der angegebenen Klasse ist 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 39

Abstrakte Klassen Klassen, von denen keine Objektinstanzen erzeugt werden können Baupläne für andere Klassen Sind mit abstract markiert. Können Methoden ohne Implementierung enthalten Diese Methoden müssen auch mit abstract markiert werden. 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 40

Interfaces Interfaces geben an, über welche Methoden eine Klasse verfügt Implementierung kann mitgegeben werden (default seit Java 8). Eine Klasse kann beliebig viele Interfaces implementieren (im Vergleich zum Erben, maximal 2 16 1 = 65535) Die Definition eines Interfaces wird mit interface eingeleitet. Klassen implementieren Interfaces mit implements. Interfaces sind Typen Gegen Interfacetyp programmieren Implementierungen einfach austauschbar Interfaces erben von Interfaces mit extends 1 ZugriffsBeschraenker interface KlassenName { 2 // Statische Konstanten (public, static, final sind implizit) 3 int ANSWER = 42; 4 // Abstrakte Methoden (abstract, public sind implizit) 5 void foo(); 6 } 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 41

Danke Vielen Dank für Ihre Aufmerksamkeit! 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 42

4. Beispiel Gegeben sei die folgende rekursive Methode: 1 static int f(int x, int y) { 2 if (y < 3) 3 return 2; 4 else if (x == 0) 5 return 3; 6 else 7 return 2 * (f(x - 2, y) - f(x - 3, y / 2)); 8 } Welchen Wert liefert der Aufruf f(10,3)? In welcher Reihenfolge und mit welchen Parametern wird f dabei aufgerufen? Geben Sie die Reihenfolge der Aufrufe explizit an. Wie groß ist die maximale Rekursionstiefe, d. h. die maximale Anzahl gleichzeitig aktiver Aufrufe? Terminiert für alle x 0, y 0 der Aufruf f(x,y) mit der Rückgabe eines int-wertes? 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 43

5. Beispiel Gegeben sei die folgende rekursive Methode: 1 static int f(int x, int y) { 2 if (y >= 4) 3 return 1; 4 else if (x <= 1) 5 return 2; 6 else 7 return 3 * f(x - 2, y + 1) - f(x, y + 1); 8 } Welchen Wert liefert der Aufruf f(3,-1)? In welcher Reihenfolge und mit welchen Parametern wird f dabei aufgerufen? Geben Sie die Reihenfolge der Aufrufe explizit an. Wie groß ist die maximale Rekursionstiefe, d. h. die maximale Anzahl gleichzeitig aktiver Aufrufe? 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 44

Lösung vom 4. Beispiel Aufruf f (x, y) 1 f (10, 3) 2 f (8, 3) 3 f (6, 3) 4 f (4, 3) 5 f (2, 3) 6 f (0, 3) 7 f ( 1, 1) 8 f (1, 1) 9 f (3, 1) 10 f (5, 1) 11 f (7, 1) f (0, 3) f (2, 3) f (4, 3) f ( 1, 1) 3 2 f (10, 3) = 28 und Rekursionstiefe ist 6 Terminiert die Rekursion immer? f (6, 3) f (1, 1) 2 f (8, 3) f (3, 1) 2 f (10, 3) f (5, 1) 2 f (7, 1) 2

Lösung vom 5. Beispiel Aufruf f (x, y) 1 f (3, 1) 2 f (1, 0) 3 f (3, 0) 4 f (1, 1) 5 f (3, 1) 6 f (1, 2) 7 f (3, 2) 8 f (1, 3) 9 f (3, 3) 10 f (1, 4) 11 f (3, 4) f (1, 0) f (3, 1) f (1, 1) f (3, 1) = 2 und Rekursionstiefe ist 6 Terminiert die Rekursion immer? 2 2 f (3, 0) f (1, 2) 2 f (3, 1) f (3, 2) f (1, 3) f (3, 3) 2 f (1, 4) 1 f (3, 4) 1

Horror für die CPU Bei jedem Aufruf Erstellen einen Stackframes auf dem Stack Kopieren des Parameters Retten von Registern (Kleine Zwischenspeicher in der CPU) Bei jedem Return Schreiben des Rückgabewertes Wiederherstellen der Register Rekursion ist langsam! fak(1) fak(2) fak(3) fak(4) fak(5) main() Aber: Compiler versuchen Rekursionen in Schleifen zu transformieren. Jedoch ist dies nur bei µ Rekursion möglich! 27.03.2018 Dr. Werner Struckmann / Maximilian von Unwerth Vorkurs Informatik SoSe18 Seite 47