Vorlesung Programmieren

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

Vorkurs Informatik WiSe 15/16

Prüfung Softwareentwicklung II (IB)

Die Klasse java.lang.object. Thorsten Treffer

Vorlesung Programmieren

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

12 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren 2 Java Überblick

Kopieren und Vergleichen

Algorithmen und Datenstrukturen

4. Vererbung Die Klasse Object. Die Klasse Object

Die abstrakte Klasse Expression:

Kopieren und Vergleichen

Objektorientierung III

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Vorlesung Programmieren

Java I Vorlesung 6 Referenz-Datentypen

Java Idioms. Basic und Advanced Java Coding Style. Prof. Dr. Nikolaus Wulff

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Programmierkurs Java

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

Übungsblatt 7. Was ist die Ausgabe de facto? Entspricht die Ausgabe Ihren Erwartungen?

Zusatzmaterial DIE KLASSE OBJECT. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

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

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

Erste Java-Programme (Scopes und Rekursion)

Informatik II Übung 6

Universität Karlsruhe (TH)

Programmierung Nachklausurtutorium

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Tag 8 Repetitorium Informatik (Java)

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Programmieren 1 09 Vererbung und Polymorphie

Listing 1: Cowboy. Listing 2: Woody

Vorlesung Programmieren

Abgabe: keine Pflichtabgabe (vor 12 Uhr) Aufgabe 10.1 (P) Vererbung Gegeben seien folgende Java-Klassen:

Objektorientierte Programmierung Studiengang Medieninformatik

Java Grundlagen 2 - OOP

Tagesprogramm

Grundelemente objektorientierter Sprachen (1)

Informatik II Musterlösung

Test zu Grundlagen der Programmierung Leitung: Susanne Guth/Michael Hahsler. 31. Jänner 2003

Grundelemente objektorientierter Sprachen (1)

Programmierung für Mathematik HS11

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

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

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Algorithmen und Programmierung II

Vererbung, Polymorphie

Vererbung. Martin Wirsing. Ziele. Vererbung

Java Einführung Vererbung und Polymorphie. Kapitel 13

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

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

Einstieg in die Informatik mit Java

Tafelübung 07 Algorithmen und Datenstrukturen

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

Algorithmen und Datenstrukturen 07

Vorlesung Programmieren

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Übungsstunde 9. Einführung in die Programmierung I

Javakurs für Anfänger

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

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

Liste Programmieren Java Überblick

Klassen und ihre Beziehungen II: Einfache Vererbung und Abhängigkeit

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

Vorlesung Programmieren

pue13 January 28, 2017

Programmieren in Java

Programmieren in Java

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

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

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert

Einführung in die Systemprogrammierung

Teil 2: OOP und JAVA (Vorlesung 11)

Nachholklausur zur Vorlesung: Einführung in die objektorientierte Programmierung mit Java WS1415

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Methoden und Wrapperklassen

Einstieg in die Informatik mit Java

1 Polymorphie (Vielgestaltigkeit)

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Beispielprüfung CuP WS 2015/2016

Objektorientierte Programmierung Studiengang Medieninformatik

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Einführung in die Informatik 1

3. Übungsbesprechung Programmkonstruktion

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

14. Java Objektorientierung

Transkript:

Vorlesung Programmieren 17 Best Practices Dr.-Ing. Erik Burger Version 1.0 ARBEITSGRUPPE ARCHITECTURE-DRIVEN REQUIREMENTS ENGINEERING (ARE) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD), KIT-FAKULTÄT FÜR INFORMATIK are.ipd.kit.edu KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu

Was erwartet Sie heute? Prinzipien des guten Programmierens in Java: 1. Polymorphie vs. instanceof 2. Unterscheidung zwischen == und equals() 3. Standardimplementierung von equals() überschreiben 4. Vorsicht bei der Implementierung von equals() 5. super.equals() verwenden 6. Vorsicht bei der Verwendung von instanceof in equals() Java-spezifische Praxistipps (gegenüber allgemeinen OO- Entwurfsprinzipien in Foliensatz 15) 2

Lernziele Studierende kennen Best Practises für oft auftretende Entscheidungen im Entwurf von Java-Programmen Studierende können die fünf vorgestellten Prinzipien anwenden Studierende kennen den Einsatzzweck der Prinzipien Studierende können gut lesbaren und gut wartbaren Code in Java schreiben 3

Literaturhinweis Weiterlesen Practical Java-Programming Language Guide, Peter Haggar, Addison Wesley, 2000 Praxis 5, 9, 10, 11, 13, 14 4

Prinzip 1: Bevorzuge Polymorphie gegenüber instanceof 5

instanceof instanceof bestimmt zur Laufzeit, zu welcher Klasse ein Objekt gehört. wird häufig im falschen Kontext eingesetzt. kann in vielen Fällen durch Polymorphie ersetzt werden. 6

Beispiel für schlechten Entwurf interface Employee{ public int salary(); class Manager implements Employee{ private static final int mgrsal = 40000; public int salary(){ return mgrsal; class Programmer implements Employee{ private static final int prgsal = 50000; private static final int prgbonus = 10000; public int salary(){ return prgsal; public int bonus(){ return prgbonus; class Payroll { public int calcpayroll(employee emp){ int money = emp.salary(); //Calculate the bonus. if(emp instanceof Programmer) money+=((programmer)emp).bonus(); return money; Arbeit des Java-Laufzeitsystems! public static void main(string arg[]){ Payroll pr = new Payroll(); Programmer prg = new Programmer(); Manager mgr = new Manager(); System.out.println("Programmer payroll: " + pr.calcpayroll(prg) ); System.out.println("Manager payroll: " + pr.calcpayroll(mgr) ); Frage: Was passiert, wenn Sie eine weitere Klasse, z.b. Executive hinzufügen möchten? Antwort: zu calcpayroll noch ein instanceof hinzufügen. Schlechter Entwurf! 7

Beispiel für ein geeignetes Design interface Employee{ public int salary(); public int bonus(); class Manager implements Employee{ private static final int mgrsal = 40000; private static final int mgrbonus = 0; public int salary(){ return mgrsal; public int bonus(){ return mgrbonus; class Programmer implements Employee{ private static final int prgsal = 50000; private static final int prgbonus = 10000; public int salary(){ return prgsal; public int bonus(){ return prgbonus; class Payroll{ public int calcpayroll(employee emp){ //Calculate the bonus. //No instanceof check needed. return emp.salary() + emp.bonus(); public static void main(string arg[]){ Payroll pr = new Payroll(); Programmer prg = new Programmer(); Manager mgr = new Manager(); System.out.println("Programmer payroll: " + pr.calcpayroll(prg) ); System.out.println("Manager payroll: " + pr.calcpayroll(mgr) ); 8

Prinzip 2: Unterscheidung zwischen == und equals() 9

Häufige Fragen Was ist der Unterschied zwischen == und equals()? Kann ich alles mit == vergleichen? Wo brauche ich equals()? 10

Beispiel class Test{ public static void main(string args[]){ int a = 10; int b = 10; System.out.println("a==b is "+ (a==b)); Integer ia = new Integer(10); Integer ib = new Integer(10); System.out.println("ia==ib is "+(ia==ib)); Programmausgabe: a==b is true ia==ib is false class Test{ public static void main(string args[]){ int a = 10; int b = 10; System.out.println("a is "+ a); System.out.println("b is "+ b); System.out.println("a==b is "+ (a==b)); Integer ia = new Integer(10); Integer ib = new Integer(10); System.out.println("ia is "+ ia); System.out.println("ib is "+ ib); System.out.println("ia==ib is "+(ia==ib)); Programmausgabe a is 10 b is 10 a==b is true ia is 10 ib is 10 ia==ib is false 11

== vs. equals() Warum verhält sich das Programm so? a und b sind vom Typ int Sie sind primitive Datentypen Sie haben keine korrespondierenden Objekte ia und ib sind hingegen vom Typ Integer Sie sind Objektreferenzen ia und ib zeigen auf unterschiedliche Objekte ia == ib liefert also den Vergleich zwischen den Objektreferenzen! Frage: Wie vergleichen Sie dann die gespeicherten Werte in Objekten? Antwort: equals() liefert einen semantischen Vergleich! Da equals() eine Methode ist, kann sie nur zum Vergleich der Objekte, nicht aber zum Vergleich der primitiven Datentypen benutzt werden 12

Weiteres Beispiel class Test { public static void main(string args[]) { int a = 10; float b = 10.0f; System.out.println("a is " + a); System.out.println("b is " + b); System.out.println("a==b is " + (a == b)); Integer ia = new Integer(10); Float fb = new Float(10.0f); System.out.println("ia is " + ia); System.out.println("fb is " + fb); System.out.println("ia.equals(fb) is " + (ia.equals(fb))); System.out.println("fb.equals(ia) is " + (fb.equals(ia))); Programmausgabe: a is 10 b is 10.0 a==b is true ia is 10 fb is 10.0 ia.equals(fb) is false fb.equals(ia) is false Erweiternde Primitivkonvertierung (widening primitive conversion) Objekte unterschiedlicher Klassen sind nie gleich. 13

Prinzip 3: Die Standardimplementierung von equals() überschreiben 14

Beispiel class Golfball { private String brand; private String make; private int compression; Zwei Golfbälle sollen genau dann gleich sein, wenn alle Attribute jeweils denselben Wert haben. public Golfball(String brd, String mk, int comp) { brand = brd; make = mk; compression = comp; public String brand() { return brand; public String make() { return make; public int compression() { return compression; class Warehouse { public static void main(string args[]) { Golfball gb1 = new Golfball( "BrandX", "Professional", 100); Golfball gb2 = new Golfball( "BrandX", "Professional", 100); if (gb1.equals(gb2)) System.out.println( "Ball 1 equals Ball 2"); else System.out.println( "Ball 1 does not equal Ball 2"); Programmausgabe: Ball 1 does not equal Ball 2 15

Implementierung der equals()-methode Warum funktionierte equals() im Beispiel von Prinzip 2, jedoch hier nicht? Das Beispiel benutzte Objekte der Integer-Klasse. Diese Klasse hat ihre eigene Implementierung der equals()-methode Golfball hat hingegen keine eigene Implementierung der equals()- Methode. In diesem Fall wird die Implementierung der equals()- Methode der Klasse java.lang.object verwendet. Wie sieht die Implementierung der equals()-methode der Klasse java.lang.object aus? public boolean equals(object obj) { return (this == obj); 16

Abhilfe durch eigene Implementierung class Golfball { // (...), as before public boolean equals(object obj) { if (this == obj) return true; if (obj!= null && getclass() == obj.getclass()) { Golfball gb = (Golfball) obj; if (brand.equals(gb.brand()) && return false; make.equals(gb.make()) && compression == gb.compression()) { return true; Programmausgabe: Ball 1 equals Ball 2 Alles funktioniert mit Attributen vom Typ String wie erwartet. 17

Probleme der vorherigen Implementierung Was passiert, wenn brand und make-attribute von Golfball-Objekt StringBuffer statt String benutzen? class Golfball { private StringBuffer brand; private StringBuffer make; private int compression; public Golfball(StringBuffer brd, StringBuffer mk, int comp) { brand = brd; make = mk; compression = comp; public StringBuffer brand() { return brand; public StringBuffer make() { return make; public int compression() { return compression; // (...), as before Problem: equals()-implementierung der StringBuffer-Klasse Programmausgabe: Ball 1 does not equal Ball 2 18

Mögliche Lösungsideen (1) Benutzen von String-Objekt Die einfachste Lösung Abhängig von der konkreten Implementierung kann StringBuffer für brand- und make-attribut von Golfball benutzt werden. 19

Mögliche Lösungsideen (2) Benutzen von String statt StringBuffer equals()-methode von Golfball wird so verändert, dass sie StringBuffer-Objekte zu String-Objekte konvertiert, equals()- Methode aufgerufen wird. equals()-methode von String wird zum Vergleich verwendet. class Golfball { // (...), as before public boolean equals(object obj) { if (this == obj) return true; if (obj!= null && getclass() == obj.getclass()) { Golfball gb = (Golfball) obj; if (brand.tostring().equals(gb.brand().tostring()) && make.tostring().equals(gb.make().tostring()) && compression == gb.compression()) { return true; return false; Problem: Aufruf einer String-Methode auf einem StringBuffer-Objekt führt jeweils zum Erzeugen eines neuen String-Objekt. Die Lösung ist sehr aufwendig! 20

Mögliche Lösungsideen (3) Eigene StringBuffer-Klasse schreiben, die equals()-methode enthält. Eigene Implementierung von equals()-methode verwenden. Implementierung ist aufwendiger, jedoch sehr vorteilhaft. Folgende Implementierung zeigt eine Enthaltensein-Beziehung zwischen MyStringBuffer und StringBuffer. Grund: StringBuffer ist eine final class Kann von ihr nicht weiter erben. 21

Beispiel MyStringBuffer class MyStringBuffer { private StringBuffer stringbuf; public MyStringBuffer(String str) { stringbuf = new StringBuffer(str); public int length() { return stringbuf.length(); public synchronized char charat(int index) { return (stringbuf.charat(index)); // Create passthrough methods for the rest of // StringBuffer methods as needed. public boolean equals(object obj) { if (this == obj) return true; if (obj!= null && getclass() == obj.getclass()) { MyStringBuffer sb = (MyStringBuffer) obj; int len = length(); if (len!= sb.length()) return false; int index = 0; while (index!= len) { if (charat(index)!= sb.charat(index)) return false; else index++; return true; return false; 22

Beispiel Golfball class Golfball { private MyStringBuffer brand; private MyStringBuffer make; private int compression; public Golfball(MyStringBuffer brd, MyStringBuffer mk, int comp) { brand = brd; make = mk; compression = comp; public MyStringBuffer brand() { return brand; public MyStringBuffer make() { return make; public boolean equals(object obj) { if (this == obj) return true; if (obj!= null && getclass() == obj.getclass()) { Golfball gb = (Golfball) obj; if (brand.equals(gb.brand()) && make.equals(gb.make()) && compression == gb.cmpression()) { return true; return false; //... public int compression() { return compression; 23

Mögliche Lösungsideen (4) equals()-methode zunächst nicht weiter berücksichtigen. Eigene compare()-methode implementieren, die zwei StringBuffer- Objekte vergleicht. equals()-methode der Golfball-Klasse so verändern, dass sie statt equals()-methode compare()-methode verwendet. Vorteile: Implementierung weiterer Klassen nicht nötig Nachteile: equals()-methode der Golfball-Klasse ruft eine compare()- Methode statt eine equals()-methode auf. Wird in Zukunft beispielsweise wieder eine String-Objekt benutzt, muss die Implementierung der equals()-methode geändert werden. 24

Prinzip 4: Vorsicht bei der Implementierung von equals() 25

Wichtige Fragen bei der Implementierung Beantworten Sie folgende Fragen, bevor Sie equals()-methode neu implementieren. Benötigt die Klasse überhaupt eine equals()-methode? Nur wenn die Objekte der Klassen logisch miteinander verglichen werden müssen, d.h. wenn der Vergleich zweier Referenzen nicht genügt. Die zuvor gezeigte Implementierungen der equals()-methode können nicht ohne weiteres auf alle Implementierungen angewendet werden. Welche Objekte sollen verglichen werden? Nur Objekte derselben Klasse? Objekte der Unterklassen mit Objekten der Basisklasse? Ihre Implementierung muss dies widerspiegeln 26

Prinzip 5: super.equals() verwenden 27

Vererbung und equals() Was passiert mit der equals()-methode bei der Vererbung? Können Objekte der abgeleiteten Klassen mit Objekten der Basisklasse verglichen werden? 28

Beispiel für einen fehlerhaften Code class MyGolfball extends Golfball { public static final byte TWO_PIECE = 0; public static final byte THREE_PIECE = 1; private byte ballconstruction; public MyGolfball(String str, String mk, int comp, byte construction) { super(str, mk, comp); ballconstruction = construction; public byte construction() { return ballconstruction; public boolean equals(object obj) { if (this == obj) return true; if (obj!= null && getclass() == obj.getclass()) { MyGolfball gb = (MyGolfball) obj; if (ballconstruction == gb.construction()) return true; return false; Zwei Golfbälle bereits gleich, wenn bloß ballconstruction-attribute denselben Wert haben 29

Beispiel für einen fehlerhaften Code Der Code zum Vergleichen der Golfball-Objekte: class Warehouse { public static void main(string args[]) { MyGolfball gb1 = new MyGolfball("BrandX", "Professional", 100, MyGolfball.TWO_PIECE); MyGolfball gb2 = new MyGolfball("BrandX", "Professional", 100, MyGolfball.TWO_PIECE); //... if (gb1.equals(gb2)) System.out.println("Ball 1 equals Ball 2"); else System.out.println("Ball 1 does not equal Ball 2"); Was passiert, wenn zwei Golfball-Objekte unterschiedliche Attributwerte haben? z.b.: MyGolfball gb1 = new MyGolfball("BrandX", "Professional", 100, MyGolfball.TWO_PIECE); MyGolfball gb2 = new MyGolfball("BrandX", "Professional", 90, MyGolfball.TWO_PIECE); Obwohl die beiden Objekte unterschiedlich sind, liefert equals(): Ball 1 equals Ball 2 30

Lösung Warum verhält sich das Programm so? Der Code in der main-methode: if (gb1.equals(gb2)) ruft die equals()-methode von MyGolfball auf. Diese Methode vergleicht nur ballconstruction-attribute von zwei MyGolfball-Objekten. equals()-methode von Golfball wird nicht weiter ausgeführt. Die Attribute brand, make und compression werden nicht verglichen. Lösung: public boolean equals(object obj) { if (this == obj) return true; if (obj!= null && getclass() == obj.getclass() && super.equals(obj)) { MyGolfball gb = (MyGolfball) obj; if (ballconstruction == gb.construction()) return true; return false; 31

Alternative Lösung Eine kürzere Lösung: public boolean equals(object obj) { if (super.equals(obj)) { MyGolfball gb = (MyGolfball) obj; if (ballconstruction == gb.construction()) return true; return false; Vorsicht beim Benutzen von kürzeren Lösung. Sie müssen immer wissen, wie equals()-methode in der Basisklasse implementiert ist. 32

Mehrere Ebenen in der Vererbungshierarchie Was passiert, wenn eine weitere Klasse in der Vererbungshierarchie zwischen den beiden Klassen Golfball und MyGolfball hinzugefügt wird? Da MyGolfball super.equals() aufruft, funktioniert alles fehlerfrei. Daumenregel: Sobald eine Basisklasse die equals()-methode implementiert, muss die equals()-methode der abgeleiteten Implementierung super.equals() aufrufen. Ausnahme: Basisklasse java.lang.object, da kein semantischer Vergleich auf Attributbasis durchgeführt wird 33

Prinzip 6: Vorsicht bei der Verwendung von instanceof in equals() 34

Vergleich der Objekte Bisher wurden Objekte von Klassen in derselben Vererbungsebene miteinander verglichen. Verwendung von getclass() Wann können die Objekte der abgeleiteten Klassen mit den Objekten der Basisklasse verglichen werden? Wenn die abgeleitete Klasse nur das Verhalten der Basisklasse ändert Die relevanten Attribute bleiben also gleich Wie können die Objekte der abgeleiteten Klassen mit den Objekten der Basisklasse verglichen werden? Die Basisklasse benutzt in der Implementierung der equals()-methode instanceof statt getclass() getclass() Die Objekte der abgeleiteten Klassen sind niemals gleich mit den Objekten der Basisklasse Die abgeleitete Klasse darf equals()-methode nicht implementieren. Die abgeleitete Klasse kann keine weiteren Attribute berücksichtigen 35

Motivierendes Beispiel für Verhaltensänderung class Car { private String make; private int year; public void drive() { // code to drive the car class MyCar extends Car { public void drive() { // code to drive the car, differently // than base class, Car public boolean equals(object obj) { // compare make and year for equality 36

Motivierendes Beispiel für Verhaltensänderung class Base { public boolean equals(object obj) { if (obj instanceof Base) //... class Derived extends Base { Base b = new Base(); Derived d = new Derived(); if (d.equals(b)) Bei Gleichheit liefert true if (b.equals(d)) Bei Gleichheit liefert true Symmetrieeigenschaft ist gegeben: d.equals(b) == b.equals(d) 37

Motivierendes Beispiel für Verhaltensänderung class Base { public boolean equals(object obj) { if (obj instanceof Base) //... class Derived extends Base { public boolean equals(object obj) { if (super.equals(obj)) //... Base b = new Base(); Derived d = new Derived(); if (d.equals(b)) liefert immer true Die Symmetrie geht verloren Grund: equals()-methode der abgeleiteten Klasse wird mit einem Objekt vom Typ Base aufgerufen. Wegen super.equals(obj) wird der Code der Basisklasse ausgeführt if (obj instanceof Base) liefert true Ein ungültiger Vergleich ist möglich Nicht alle Objekte der Unterklassen müssen immer beim Vergleich mit den Objekten der Basisklasse true liefern 38

Motivierendes Beispiel für Verhaltensänderung class Base { public boolean equals(object obj) { if (obj instanceof Base) //... class Derived extends Base { public boolean equals(object obj) { if (obj instanceof Derived) //... S Base b = new Base(); Derived d = new Derived(); if (d.equals(b)) liefert immer false if (b.equals(d)) equals()-methode der Basisklasse wird verwendet. instanceof-überprüfung liefert true Falls Attribute gleich liefert immer true 1. Dieses Verhalten ist unintuitiv und fehleranfällig. 2. Beim Testen muss dem Programmierer der genaue Code bekannt sein. 3. Dies gilt für alle, die den Code benutzen. 4. Wenn ein Objekt durch seine Basisklasse referenziert wird, kann es ein Objekt vom Typ java.lang.object zurückgeben. Ohne zusätzliche Überprüfung kann nicht die abgeleitete Klasse identifiziert werden. 39

Zusammenfassung Die Basisklasse implementiert equals()-methode, die abgeleitete Klasse jedoch nicht Wenn die Basisklasse in der Implementierung instanceof benutzt, können die Objekte der Unterklassen mit Objekte der Oberklassen verglichen werden Der Vergleich ist symmetrisch Die Basisklasse und die abgeleitete Klasse implementieren equals()- Methode: Wenn die equals()-methode der beiden Klassen instanceof benutzt false wird zurückgegeben, wenn equals()-methode der abgeleiteten Klasse verwendet wird. true wird zurückgegeben, wenn equals()-methode der Basisklasse verwendet wird. Die abgeleitete Klasse implementiert equals()-methode, die Basisklasse jedoch nicht equals()-aufrufe der beiden Methoden liefern false (jedoch aus unterschiedlichen Gründen) 40

Termine Anmeldung zur Abschlussaufgabe: 02. Februar 23. Februar Anmeldung erst möglich, nachdem Übungsschein als bestanden ins Campus-Management-System eingetragen wurde. Eintragung der Übungsscheine für dieses Semester erfolgt ab 11. Februar Eine nachträgliche Anmeldung (nach 23. Februar) ist nicht möglich! Abschlussaufgabe 1: Veröffentlichung: Abgabe: 10. Februar 10. März Abschlussaufgabe 2: Veröffentlichung: Abgabe: 24. Februar 24. März 42