Tutorium zur Vorlesung Programmieren

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

Vorkurs Informatik WiSe 15/16

Tutorium zur Vorlesung Programmieren

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

Programmierung Nachklausurtutorium

Informatik II Übung 6

Propädeutikum Programmierung in der Bioinformatik

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen 07

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmieren 2 Java Überblick

Informatik II - Tutorium 6

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

12 Abstrakte Klassen, finale Klassen und Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmierkurs Java

Algorithmen und Datenstrukturen

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

II.4.1 Unterklassen und Vererbung - 1 -

Programmieren in Java

II.4.1 Unterklassen und Vererbung - 1 -

Das Interface-Konzept am Beispiel der Sprache Java

Vererbung, Polymorphie

II.4.1 Unterklassen und Vererbung - 1 -

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Softwaretechnik WS 16/17. Übungsblatt 01

Objekt-orientierte Programmierung

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

Vererbung. CoMa-Übung XI TU Berlin. CoMa-Übung XI (TU Berlin) Vererbung / 47

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

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

Javakurs für Anfänger

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Objektorientierte Programmierung Studiengang Medieninformatik

Java Grundlagen 2 - OOP

14. Java Objektorientierung

Objektorientierte Programmierung Studiengang Medieninformatik

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Polymorphie. 15. Java Objektorientierung II

Programmieren in Java

3 Objektorientierte Konzepte in Java

Polymorphie. 15. Java Objektorientierung II

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

Objektorientierte Programmierung. Kapitel 14: Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

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

II.4.1 Unterklassen und Vererbung - 1 -

Einführung in die Programmierung

6. Globalübung (zu Übungsblatt 8)

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

Tafelübung 07 Algorithmen und Datenstrukturen

HERZLICH WILLKOMMEN PROGRAMMIERKURS (JAVA) ZUM. Dr. Vera Weil Institut für Informatik Universität zu Köln. 9. Vorlesung (05.

ListElement (E i n f o, ListElement<E> prev, ListElement<E> next ) {

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Programmieren in Java

Abstrakte Basisklassen

Programmierkurs C++ Abstrakte Klassen und Methoden

Programmieren in Java -Eingangstest-

14. Java Objektorientierung

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Teil 2-3. Vorlesung. Modul: Programmierung B-PRG Grundlagen der Programmierung II

Programmiermethodik 3. Klausur Lösung

Objektorientierte Programmierung

Wiederholung. Klassenhierarchie:

Programmiermethodik 2. Klausur Lösung

Die abstrakte Klasse Expression:

Javakurs für Anfänger

Abstrakte Basisklassen

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

3 Objektorientierte Konzepte in Java

Programmieren 2 16 Java Collections und Generizität

Objektorientierte Programmierung Studiengang Medieninformatik

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Programmieren in Java

Einführung in C# Teil 3. Matthias Nübling

Einstieg in die Informatik mit Java

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

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

Java Vererbung. Inhalt

Javakurs für Anfänger

Objektorientierte Programmierung. Kapitel 12: Interfaces

Informatik II Übung 06. Benjamin Hepp 5 April 2017

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

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Kapitel 5: Interfaces

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

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

Einstieg in die Informatik mit Java

Abschnitt 10: Typisierte Klassen

Transkript:

Tutorium zur Vorlesung Programmieren 8. Tutorium Joshua Gleitze 19. Dezember 2016 IPD Koziolek

Beispiellösung Beispiellösung für das 3. Übungsblatt, inklusive Tests: joshuagleitze.de/tutorien/programmieren1617/code/beispiellösung3

Codebeispiele Codebeispiele, die in diesem Tutorium immer wieder verwendet werden: joshuagleitze.de/tutorien/programmieren1617/folien/08_codebeispiele.pdf

Vererbung und Interfaces

Vererbung Modelliert eine ist ein -Beziehung Wer von einer Klasse erbt, erhält alle Methoden und Attribute der Oberklasse Konstruktoren werden nicht vererbt

statischer und dynamischer Typ Weapon favouriteweapon = new Claymore(); statischer Typ dynamischer Typ Weapon Claymore

Überschreiben Eine Unterklasse kann eine Methode überschreiben Die Entscheidung, welche Implementierung verwendet wird, basiert auf dem dynamischen Typ Wird konventionell mit @Override markiert.

Verschatten Eine Unterklasse kann ein Attribut verschatten Die Entscheidung, welche Implementierung verwendet wird, basiert auf dem statischen Typ

Verschatten Eine Unterklasse kann eine statische Methode verschatten Die Entscheidung, welche Implementierung verwendet wird, basiert auf dem statischen Typ

super Analogon zu this: Referenziert die Implementierungen der Oberklasse. super(parameter) ruft Konstruktor der Oberklasse auf super.methode(parameter) ruft Implementierung von methode der Oberklasse auf

Konstruktoren Jeder Konstruktor einer Unterklasse muss in der ersten Anweisung den Konstruktor der Oberklasse aufrufen Hat die Oberklasse einen Konstruktor ohne Parameter, macht Java das implizit

Interfaces Ein Interface definiert eine Schnittstelle. Wer ein Interface implementiert, muss alle Methoden implementieren.

Interfaces: Details Alle Methoden sind public abstract Alle Attribute sind public static final statische Methoden sind möglich, wenn sie direkt implementiert werden

Interfaces: Details 1 public interface Program { 2 int VERSION = 1; 3 4 String getname(); 5 } ˆ= 1 public interface Program { 2 public static final int VERSION = 1; 3 4 public abstract String getname(); 5 }

Beispiel Claymore claymore = new Claymore(); System.out.println(claymore.getPrice());

Beispiel Claymore claymore = new Claymore(); System.out.println(claymore.getPrice()); 3136

Beispiel Katana katana = new Katana(); System.out.println(katana.getPrice());

Beispiel Katana katana = new Katana(); System.out.println(katana.getPrice()); 5040

Beispiel Sword sword = new Katana(); System.out.println(sword.getPrice());

Beispiel Sword sword = new Katana(); System.out.println(sword.getPrice()); 5040

Beispiel Weapon weapon = new Claymore(); System.out.println(weapon.getPrice());

Beispiel Weapon weapon = new Claymore(); System.out.println(weapon.getPrice()); 3136

Beispiel System.out.println(Katana.PRICE_FACTOR);

Beispiel System.out.println(Katana.PRICE_FACTOR); 3

Beispiel System.out.println(Claymore.PRICE_FACTOR);

Beispiel System.out.println(Claymore.PRICE_FACTOR); 2

Beispiel 1 public class SimpleSword extends Sword { 2 protected int age = 2; 3 4 public SimpleSword(Material Material, int length) { 5 super(material, length); 6 } 7 8 public int getdamage() { 9 return this.material.getprice(); 10 } 11 } SimpleSword woodensword = new SimpleSword(Material.WOOD, 4); System.out.println(woodenSword.getAge());

Beispiel 1 public class SimpleSword extends Sword { 2 protected int age = 2; 3 4 public SimpleSword(Material Material, int length) { 5 super(material, length); 6 } 7 8 public int getdamage() { 9 return this.material.getprice(); 10 } 11 } SimpleSword woodensword = new SimpleSword(Material.WOOD, 4); System.out.println(woodenSword.getAge()); 0

Interface abstrakte Klasse Klasse

Interface Möglichst klein: Genau eine Aufgabe Eine Klasse kann mehrere Interfaces implementieren Repräsentiert gewisse zugesicherte Eigenschaften Endet deshalb oft auf -able Iterable, Comparable, Serializable, Closeable, Runnable, Cloneable

Interface: Beispiel java.lang.comparable (OpenJDK 8) 96 public interface Comparable<T> {... 136 public int compareto(t o); 137 }

abstrakte Klasse Nicht sinnvoll instanziierbar Implementiert gemeinsame Funktionalität für Unterklassen Diese kann oft durch abstrakte Schablonenmethoden parametrisiert werden

abstrakte Klasse: Beispiel java.util.abstractcollection (OpenJDK 8) 61 public abstract class AbstractCollection<E> implements Collection<E> {... 78 public abstract int size();... 85 public boolean isempty() { 86 return size() == 0; 87 }

Klasse Kann sinnvoll instanziiert werden

Vererbungslehre Interfaces Können von mehreren anderen Interfaces erben public interface ConcurrentNavigableMap<K,V> extends ConcurrentMap<K,V>, NavigableMap<K,V>

Vererbungslehre Abstrakte Klassen Können von höchstens einer (ggf. abstrakten) Klasse erben Können mehrere Interfaces implementieren public abstract class AbstractQueue<E> extends AbstractCollection<E> implements Queue<E>

Vererbungslehre Klassen Können von höchstens einer (ggf. abstrakten) Klasse erben Können mehrere Interfaces implementieren Müssen alle nicht implementierten Methoden implementieren public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.serializable

Verwendung Für die statischen Typen von Rückgabewerten und formalen Parametern sind immer Interfaces vorzuziehen!

Details zu Methoden

Überladen Gibt es von einer Methode mit dem selben Namen mehrere Versionen mit verschiedenen formalen Parametern, so nennt man diese Methode überladen. java.util.list E remove(int item); boolean remove(object o);

Überladen: Auswahl Die Variante überladener Methoden wird anhand der statischen Typen ausgewählt.

Beispiel: Überladen 1 public class SwordMerchant { 2 public int priceforweapon(weapon weapon) { 3 return weapon.getprice() / 2; 4 } 5 6 public int priceforweapon(sword weapon) { 7 return weapon.getprice() - 40; 8 } 9 }

Beispiel: Überladen 1 public class SwordMerchant { 2 public int priceforweapon(weapon weapon) { 3 return weapon.getprice() / 2; 4 } 5 public int priceforweapon(sword weapon) { 6 return weapon.getprice() - 40; 7 } 8 } SwordMerchant merchant = new SwordMerchant(); Sword mybestweapon = new Katana(); System.out.println(merchant.priceForWeapon(myBestWeapon));

Beispiel: Überladen 1 public class SwordMerchant { 2 public int priceforweapon(weapon weapon) { 3 return weapon.getprice() / 2; 4 } 5 public int priceforweapon(sword weapon) { 6 return weapon.getprice() - 40; 7 } 8 } SwordMerchant merchant = new SwordMerchant(); Sword mybestweapon = new Katana(); System.out.println(merchant.priceForWeapon(myBestWeapon)); 5000

Beispiel: Überladen 1 public class SwordMerchant { 2 public int priceforweapon(weapon weapon) { 3 return weapon.getprice() / 2; 4 } 5 public int priceforweapon(sword weapon) { 6 return weapon.getprice() - 40; 7 } 8 } SwordMerchant merchant = new SwordMerchant(); Weapon mybestweapon = new Katana(); System.out.println(merchant.priceForWeapon(myBestWeapon));

Beispiel: Überladen 1 public class SwordMerchant { 2 public int priceforweapon(weapon weapon) { 3 return weapon.getprice() / 2; 4 } 5 public int priceforweapon(sword weapon) { 6 return weapon.getprice() - 40; 7 } 8 } SwordMerchant merchant = new SwordMerchant(); Weapon mybestweapon = new Katana(); System.out.println(merchant.priceForWeapon(myBestWeapon)); 2520

Beispiel: Überladen 1 public class SwordMerchant { 2 public boolean willtradeweapons(weapon giveaway, Weapon getnew) { 3 return getnew.getprice() > giveaway.getprice(); 4 } 5 6 public boolean willtradeweapons(weapon giveaway, Sword getnew) { 7 return true; 8 } 9 10 public boolean willtradeweapons(sword giveaway, Weapon getnew) { 11 return false; 12 } 13 }

Beispiel: Überladen 1 public class SwordMerchant { 2 public boolean willtradeweapons(weapon giveaway, Weapon getnew) { 3 return getnew.getprice() > giveaway.getprice(); 4 } 5 public boolean willtradeweapons(weapon giveaway, Sword getnew) { 6 return true; 7 } 8 public boolean willtradeweapons(sword giveaway, Weapon getnew) { 9 return false; 10 } 11 } final SwordMerchant merchant = new SwordMerchant(); final Weapon mybestsword = new Katana(); final Weapon weaponiwant = new Claymore(); System.out.println( merchant.willtradeweapons(weaponiwant, mybestsword));

Beispiel: Überladen 1 public class SwordMerchant { 2 public boolean willtradeweapons(weapon giveaway, Weapon getnew) { 3 return getnew.getprice() > giveaway.getprice(); 4 } 5 public boolean willtradeweapons(weapon giveaway, Sword getnew) { 6 return true; 7 } 8 public boolean willtradeweapons(sword giveaway, Weapon getnew) { 9 return false; 10 } 11 } final SwordMerchant merchant = new SwordMerchant(); final Weapon mybestsword = new Katana(); final Weapon weaponiwant = new Claymore(); System.out.println( merchant.willtradeweapons(weaponiwant, mybestsword)); true

Beispiel: Überladen 1 public class SwordMerchant { 2 public boolean willtradeweapons(weapon giveaway, Weapon getnew) { 3 return getnew.getprice() > giveaway.getprice(); 4 } 5 public boolean willtradeweapons(weapon giveaway, Sword getnew) { 6 return true; 7 } 8 public boolean willtradeweapons(sword giveaway, Weapon getnew) { 9 return false; 10 } 11 } final SwordMerchant merchant = new SwordMerchant(); final Weapon mybestsword = new Katana(); final Sword weaponiwant = new Claymore(); System.out.println( merchant.willtradeweapons(weaponiwant, mybestsword));

Beispiel: Überladen 1 public class SwordMerchant { 2 public boolean willtradeweapons(weapon giveaway, Weapon getnew) { 3 return getnew.getprice() > giveaway.getprice(); 4 } 5 public boolean willtradeweapons(weapon giveaway, Sword getnew) { 6 return true; 7 } 8 public boolean willtradeweapons(sword giveaway, Weapon getnew) { 9 return false; 10 } 11 } final SwordMerchant merchant = new SwordMerchant(); final Weapon mybestsword = new Katana(); final Sword weaponiwant = new Claymore(); System.out.println( merchant.willtradeweapons(weaponiwant, mybestsword)); false

Beispiel: Überladen 1 public class SwordMerchant { 2 public boolean willtradeweapons(weapon giveaway, Weapon getnew) { 3 return getnew.getprice() > giveaway.getprice(); 4 } 5 public boolean willtradeweapons(weapon giveaway, Sword getnew) { 6 return true; 7 } 8 public boolean willtradeweapons(sword giveaway, Weapon getnew) { 9 return false; 10 } 11 } final SwordMerchant merchant = new SwordMerchant(); final Sword mybestsword = new Katana(); final Sword weaponiwant = new Claymore(); System.out.println( merchant.willtradeweapons(weaponiwant, mybestsword));

Beispiel: Überladen 1 public class SwordMerchant { 2 public boolean willtradeweapons(weapon giveaway, Weapon getnew) { 3 return getnew.getprice() > giveaway.getprice(); 4 } 5 public boolean willtradeweapons(weapon giveaway, Sword getnew) { 6 return true; 7 } 8 public boolean willtradeweapons(sword giveaway, Weapon getnew) { 9 return false; 10 } 11 } final SwordMerchant merchant = new SwordMerchant(); final Sword mybestsword = new Katana(); final Sword weaponiwant = new Claymore(); System.out.println( merchant.willtradeweapons(weaponiwant, mybestsword)); error: reference to willtradeweapons is ambiguous System.out.println(merchant.willTradeWeapons(weaponIWant, mybestsword)); ^ both method willtradeweapons(weapon,sword) in SwordMerchant and method willtradeweapons(sword,weapon) in SwordMerchant match

Das waren Beispiele so nicht programmieren! Richtige Lösung: Entwurfsmuster Besucher, siehe Vorlesung Softwaretechnik I

default-methoden

default In Java 8 können Interfaces auch Methoden implementieren. 1 public interface Food { 2 int getnutritivevalue(); 3 4 default int getprice() { 5 return this.getnutritivevalue() * 5; 6 } 7 }

default In Java 8 können Interfaces auch Methoden implementieren. 1 public class Apple implements Food { 2 public int getnutritivevalue() { 3 return 1; 4 } 5 } new Apple().getPrice(); // 5

default In Java 8 können Interfaces auch Methoden implementieren. Problem?

default In Java 8 können Interfaces auch Methoden implementieren. 1 public interface Weapon { 2 int getdamage(); 3 4 default int getprice() { 5 return this.getdamage() * 10; 6 } 7 }

default In Java 8 können Interfaces auch Methoden implementieren. 1 public class PoisonousApple implements Food, Weapon { 2 public int getnutritivevalue() { 3 return 1; 4 } 5 6 public int getdamage() { 7 return 2; 8 } 9 }

default In Java 8 können Interfaces auch Methoden implementieren. 1 public class PoisonousApple implements Food, Weapon { 2 public int getnutritivevalue() { 3 return 1; 4 } 5 6 public int getdamage() { 7 return 2; 8 } 9 } error: class PoisonousApple inherits unrelated defaults for getprice() from types Weapon and Food

default In Java 8 können Interfaces auch Methoden implementieren. 1 public class PoisonousApple implements Food, Weapon { 2 public int getnutritivevalue() { 3 return 1; 4 } 5 6 public int getdamage() { 7 return 2; 8 } 9 10 public int getprice() { 11 return 20; 12 } 13 }

default In Java 8 können Interfaces auch Methoden implementieren. 1 public class PoisonousApple implements Food, Weapon { 2 public int getnutritivevalue() { 3 return 1; 4 } 5 6 public int getdamage() { 7 return 2; 8 } 9 10 public int getprice() { 11 return Weapon.super.getPrice(); 12 } 13 }

default In Java 8 können Interfaces auch Methoden implementieren. 1 public class PoisonousApple extends Apple implements Weapon { 2 public int getnutritivevalue() { 3 return 1; 4 } 5 6 public int getdamage() { 7 return 2; 8 } 9 10 public int getprice() { 11 return super.getprice(); 12 } 13 }

Generische Typen

Generische Typen Methoden und Klassen können Typvariablen deklarieren.

Begriffe Begriff Generischer Typ (generic type) Typvariable / formaler Typparameter (formal type parameter) Parametrisierter Typ (Parameterized type) Typparameter (actual type paramter) Originaltyp (raw type) Beispiel List<T> T List<String> String List

Diamant-Operator Kurzzschreibweise, falls die Typparameter aus dem Kontext klar sind. Map<Person, Set<Person>> siblings = new HashMap<Person, Set<Person>>();

Diamant-Operator Kurzzschreibweise, falls die Typparameter aus dem Kontext klar sind. Map<Person, Set<Person>> siblings = new HashMap<>();

Typeinschränkungen extends X gibt an, dass eine Typvariable nur mit Typen, die X sind oder von X erben, belegt werden kann. super X gibt an, dass eine Typvariable nur mit Typen, die X sind oder von denen X erbt, belegt werden kann. java.util.arrays static <T extends Comparable<? super T>> void parallelsort(t[] a)