Informatik II - Tutorium 6 Vincent Becker vincent.becker@inf.ethz.ch 11.04.2018 Vincent Becker 11.04.2018 1
Teilnehmer für Projekte gesucht Falls jemand gerne an Experimenten teilnimmt, ein Email an mich schreiben Dann benachrichtige ich euch bei Bedarf Völlig unverbindlich Zum Wohle der Wissenschaft ;) Vincent Becker 11.04.2018 2
Tutorium nächste Woche Wieder gehalten von Christelle Gloor Gleicher Raum, 13:00 Uhr Vincent Becker 11.04.2018 3
Übungsblatt 5 Vincent Becker 11.04.2018 4
Listen Array: Alle Plätze liegen im Speicher hintereinander 32 42 21 7 54 9 int[] a Listen: über Zeiger verkettet 32 adr 9 adr 42 adr 21 adr List l 7 adr 54 adr Varianten: Einfach, doppelt, zyklisch verkettet Vincent Becker 11.04.2018 5
Wie kann man eine Liste realisieren? public class List { public int ; public List ; public List(int, List ) { this. = ; mylist this. = ; 76 15 22 3 32 Vincent Becker 11.04.2018 6
List Methoden (rekursiv) mylist 76 15 22 3 32 add(list list, int ) Erstellen einer neuen Liste mit gegebenem Wert, die alte Liste wird angehängt mylist mylist2 23 76 15 22 3 32 public static List add(list list, int ) { return new List(, list); Vincent Becker 11.04.2018 7
List Methoden (rekursiv) size(list list) 1 + Grösse der Restliste mylist 76 15 22 3 32 1 + size public static int size(list list) { if (list == null) return 0; return size(list.) + 1; sum(list list) Value + Summe der Restliste last(list list) Prüfen ob list. null ist, wenn nicht last auf Restliste anwenden Vincent Becker 11.04.2018 8
U5.A4 Dynamischer Stack als Liste implementiert + Kein Kopieren beim Erreichen der Kapazität mehr nötig + Push und Pop einfach realisierbar public class Stack { private List list; public Stack() { list = null; public void push(int number) { list = Lists.add(list, number); public int pop() throws EmptyStackException { if (list == null) throw new EmptyStackException(); int res = list.; list = list.; return res; Vincent Becker 11.04.2018 9
Java Vererbung & Interfaces Gliederung Beispiel Person-Klasse Inheritance (Vererbung) Type compatibility Polymorphism instanceof Visibility rules Constructor and super() Final methods and class Abstract classes and methods Interfaces Abstract classes vs. interfaces Vincent Becker 11.04.2018 10
Class Person Person Name Age Address PhoneNumber tostring() getname() getage() getaddress() getphonenumber() setaddress(newaddress) setphonenumber(newphonenumber) Attributes Accessors Mutators Getter and Setter Methods Vincent Becker 11.04.2018 11
Class Person - Implementierung public class Person { private String m_name; private int m_age; private String m_address; private String m_phone; public Person(String name, int age, String address, String phone) { m_name = name; m_age = age; m_address = address; m_phone = phone; public String tostring() { return getname() + " is " + getage() + "old and lives in " + getaddress(); public String getname() { return m_name; public int getage() { return m_age; public String getaddress() { return m_address; public String getphonenumber() { return m_phone;... Vincent Becker 11.04.2018 12
Class Student eine Erweiterung von Person Wie würde man einen Studenten modellieren? Was hat ein Student, was eine Person im Allgemeinen nicht hat? Person Name Age Address PhoneNumber Student Name Age Address PhoneNumber Legi tostring() getname() getage() getaddress() getphonenumber() setaddress(newaddress) setphonenumber(newphonenumber) tostring() getname() getage() getaddress() getphonenumber() getlegi() setaddress(newaddress) setphonenumber(newphonenumber) Vincent Becker 11.04.2018 13
Class Student Student erweitert ein bestehendes Konzept, die Person enthält ein zusätzliches Feld: m_legi mit Getter: getlegi() public class Student extends Person { private String m_legi; public Student(String name, int age, String address, String phone, String legi){ super(name, age, address, phone); m_legi = legi; public String tostring() { return getname() + " is " + getage() + "old, lives in " + getaddress() + " and has legi-nr.: " + getlegi(); public String getlegi() { return m_legi; Vincent Becker 11.04.2018 14
Class Student Student definiert einen Konstruktor ruft Basisklassenkonstruktor mit super auf public class Student extends Person { private String m_legi; public Student(String name, int age, String address, String phone, String legi){ super(name, age, address, phone); m_legi = legi; @Override public String tostring() { return getname() + " is " + getage() + "old, lives in " + getaddress() + " and has legi-nr.: " + getlegi(); public String getlegi() { return m_legi; Vincent Becker 11.04.2018 15
Class Student Student definiert die Methode tostring() neu public class Student extends Person { private String m_legi; public Student(String name, int age, String address, String phone, String legi){ super(name, age, address, phone); m_legi = legi; @Override public String tostring() { return getname() + " is " + getage() + "old, lives in " + getaddress() + " and has legi-nr.: " + getlegi(); public String getlegi() { return m_legi; Vincent Becker 11.04.2018 16
Vererbung Student erbt von Person Student kann: Neue Attribute hinzufügen m_legi Neue Methoden hinzufügen getlegi() Bestehende Methoden überschreiben (override) tostring() Student kann nicht: Attribute entfernen Methoden entfernen Vincent Becker 11.04.2018 17
Warum Vererbung? Besseres Design & Struktur Abstraktion der realen Welt, Modellierung von ist ein - Beziehungen z.b. Student peter peter ist ein Student und peter ist ein Person Wiederverwendung von Code Bessere Wartbarkeit Vincent Becker 11.04.2018 18
Static & Dynamic Cast Person Student Employee Person p = new Person(...); Student s = new Student(...); Employee e = new Employee(...); Person ps = s ok Person pe = e ok Student sp = p compile error Student sps = ps compile error Student dsps = (Student) ps ok Employee deps = (Employee) ps runtime error Vincent Becker 11.04.2018 19
Static & Dynamic Cast Person Student Employee Person p = new Person(...); Student s = new Student(...); Employee e = new Employee(...); p instanceof Person true p instanceof Student false s instanceof Person true s instanceof Student true Vincent Becker 11.04.2018 20
Die Klasse Object in Java Ist die Oberklasse aller Klassen in Java, auch von selbst programmierten Klassen Basistypen wie int nicht enthalten, da keine Klassen Wird eine Klasse definiert, erbt sie implizit von Object public class MyClass {... Ist äquivalent zu public class MyClass extends Object {... Vincent Becker 11.04.2018 21
Die Klasse Object Object Person Student Employee Quelle: sun.com Vincent Becker 11.04.2018 22
Visibility private Attribute Auf private Attribute der Oberklasse kann in der Unterklasse nicht zugegriffen werden, genauso wie in jeder anderen Klasse protected Attribute Protected Attribute sind sichtbar in den Unterklassen und in den Klassen im selben Package, aber nicht darüber hinaus public Attribute Überall sichtbar Vincent Becker 11.04.2018 23
Final Methoden und Klassen Eine Unterklasse kann die Methoden der Oberklasse verwenden oder die Methoden der Oberklasse überschreiben (override) Eine mit final deklarierte Methode in der Oberklasse kann in der Unterklasse nicht überschrieben werden Von einer mit final deklarierten Klasse kann nicht geerbt werden z.b. Integer, Character Vincent Becker 11.04.2018 24
Abstrakte Klassen abstract Methode Eine Methode die alle Unterklassen implementieren müssen In C++ war das eine rein virtuelle Methode class myclass { public: virtual void vfunc() = 0; //pure virtual function ; abstract Klasse Eine Klasse mit mindestens einer abstrakten Methode Wird eine abstrakte Methode in der Unterklasse nicht implementiert, kommt es zu einem Compilerfehler Vincent Becker 11.04.2018 25
Interfaces (Schnittstellen) Deklariert Methodensignaturen, die von einer implementierenden Klasse implementiert werden müssen Eine Klasse kann mehrere Interfaces implementieren Eine implementierende Klasse muss alle Methodendeklarationen des Interfaces implementieren Neuerung in Java 8: default erlaubt Implementierung im Interface Also ähnlich zu einer abstrakten Klasse Vincent Becker 11.04.2018 26
abstract class vs. interface Abstract class Kann vollständige Implementierungen enthalten und/oder abstrakte Methoden Interface In der Regel sind keine Implementierungen enthalten (Ausnahme: default in Java8) Methoden können protected sein Attribute, Konstanten, Alle Methoden sind implizit public Nur Konstanten (public static final) http://docs.oracle.com/javase/tutorial/java/iandi/index.html Vincent Becker 11.04.2018 27
Beispiel Interface IStack public interface IStack { int size(); void push(object obj); Object pop(); Object peek(); boolean empty(); public class MyStack implements IStack { private int size; public int size() { return size; public void push(object obj) {...... Vincent Becker 11.04.2018 28
Beispiel Abstrakte Klasse BaseStack public abstract class BaseStack implements IStack { public abstract int size(); public abstract void push(object obj); public abstract Object pop(); public Object peek(){ Object top = pop(); push(top); return top; public boolean empty() { return size() == 0; public class MyStack extends BaseStack { private GenericList first; @Override public Object peek() { return first.;... Vincent Becker 11.04.2018 29
public class A { public void dosomething() { System.out.println("A"); public class B extends A { @Override public void dosomething() { System.out.println("B"); A a = new A(); B b = new B(); A ab = new B(); a.dosomething(); b.dosomething(); ab.dosomething(); Was ist die Ausgabe? A B B A B A B A B Vincent Becker 11.04.2018 30
Übungsblatt 6 Vincent Becker 11.04.2018 31
U6.A1 Modellierungsdiagramm mittels UML: Unified Modeling Language http://de.wikipedia.org/wiki/klassendiagramm Vincent Becker 11.04.2018 32
U6.A2 Fabrikmethode Folgendes Szenario: 1. Programmierer Listenpro implementiert verschiedene Listen, die alle das Interface IList verwirklichen 2. Programmierer Listenuser benutzt Listen, will aber nichts über die Funktionsweise wissen 3. Wenn Listenpro eine neue Implementierung schreibt, muss Listenuser im Code alle Zeilen mit new ListA() auf new ListB() umschreiben. Das ist nervig! 4. Listenpro hat eine bessere Lösung und stellt eine Fabrikmethode zur Verfügung, z.b. Factory.giveMeNewList(), die immer ein Objekt der neuesten Implemenierung liefert. Vincent Becker 11.04.2018 33
U6.A3 Generische Listen Eine generische Liste handhabt nicht mehr nur Objekte eines bestimmten Typs, sondern Instanzen der Klasse Object, und damit Instanzen aller Klassen Hier muss eine Utility-Klasse erstellt werden, indem IListUtils implementiert wird Achtung: Diesmal wird die Utility-Klasse instanziiert und ist nich mehr static Vincent Becker 11.04.2018 34
U6.A3 GeometricObject <<interface>> Comparable Schreibt smallerthan vor implements <<abstract>> GeometricObject Schreibt area() vor, kann smallerthan implementieren extends extends Rectangle Triangle Müssen beide area() auf ihre Weise implementieren Vincent Becker 11.04.2018 35
U6.A4 Wieder ein Stack Kombination Listen und Arrays zur Implementierung eines dynamischen Stacks Eine Liste von Arrays Fortgeschrittene Aufgabe, wer sie lösen kann, kann sehr wahrscheinlich genug für die Prüfung (im Programmierteil) Vincent Becker 11.04.2018 36
viel Spass! Vincent Becker 11.04.2018 37