IT I: Heute Interfaces Interfaces List, Set und Collection HashCode HashSet Projekt Filialenbelieferung Fehler und Debugging Modularisierung 19.11.2015 IT I - VO 7 1
WÜ: Vererbung Attribute aus der Oberklasse werden in Unterklasse nicht nochmals angelegt! Zum Aufruf super(...); im Konstruktor der Unterklasse muss es in der Oberklasse passenden Konstruktor geben! 19.11.2015 IT I - VO 7 2
Abstrakte Methoden und Klassen Eine abstrakte Methode ist die Definition einer Methode ohne Implementierung: abstract String getdetails(); Eine Klasse mit einer abstrakten Methode muss selbst abstrakt sein: abstract class Disk { } Von einer abstrakten Klasse können keine Objekte erzeugt werden (da u.u. manche Methoden nicht implementiert sind). In einer nicht-abstrakten Unterklasse einer abstrakten Klasse muss es für alle abstrakten Methoden Implementierungen geben. 19.11.2015 IT I - VO 7 3
Java interfaces Interfaces sind eine besondere Form von abstrakten Klassen: Alle Methoden sind public und abstract. Es gibt keine Konstruktoren. Es gibt keine Attribute außer Konstantendefinitionen, die public, static und final sind. D.h., dass eine nicht-abstrakte Unterklasse eines Interfaces alle Methoden des Interfaces implementieren muss. Insofern ist ein Interface eine Spezifikation, die angibt, über welche Methoden eine Objekt dieses Typs verfügt. 19.11.2015 IT I - VO 7 4
Syntax von Java interfaces (1) interface Interfacename { } class Klassenname implements Interfacename { } 19.11.2015 IT I - VO 7 5
ArrayList implementiert Interface List 19.11.2015 IT I - VO 7 6
List Gegeben: List<Anlage> liste; kann alle Methoden aus dem Interface List verwenden: - get(i) - for each Schleife - size() - etc. 19.11.2015 IT I - VO 7 7
List Rückgabewert List<Anlage>: muss Objekt einer Klasse zurückgeben, das List implementiert, z.b. ArrayList List<Anlage> = new ArrayList<Anlage>(); oder ArrayList<Anlage> = new ArrayList<Anlage>(); 19.11.2015 IT I - VO 7 8
Interfaces Interfaces können ganz normal als Datentyp eingesetzt werden, s. Bspe. mit Interface List! Weiteres Beispiel: interface eininterface { public boolean istdoof(); } eininterface x =...; if(x.istdoof()){...} NB: Konkrete Objekte (z.b. rechte Seite der Zuweisung x=...;) sind immer von einer Klasse, die das Interface implementiert! 19.11.2015 IT I - VO 7 9
Mehrfachvererbung 19.11.2015 IT I - VO 7 10
Mehrfachvererbung Wenn eine Klasse von mehreren Oberklassen erbt, kann es zu Konflikten kommen, wenn dieselbe Methode in mehreren Oberklassen unterschiedlich implementiert ist. Welche Methode wird ausgeführt? In Java wird dieser Konflikt vermieden, indem es nur eine echte Oberklasse geben kann, alle anderen Oberklassen müssen Interfaces sein. Da es in Interfaces keine Implementierung gibt, kommt es zu keinen Konflikten. 19.11.2015 IT I - VO 7 11
Syntax von Java interfaces (2) interface Interfacename implements Interface1,, InterfaceK { } class Klassenname extends Oberklasse implements Interface1,, InterfaceK { } 19.11.2015 IT I - VO 7 12
Collections (1) Hold groups of objects. Increase their capacity as necessary. Keep the objects in (some) order. Details of how all this is done are hidden. We specify: the type of a collection: e.g. ArrayList the type of the objects it will contain: e.g. <String> Collections are defined in java.util. 19.11.2015 IT I - VO 7 13
Collections (2) Die Gemeinsamkeiten von Collections sind im Interface Collection definiert. Wichtige Sub-Interfaces von Collection sind List und Set. Konkrete (nicht-abstrakte) Unterklassen von List sind ArrayList und LinkedList, sowie HashSet und TreeSet von Set. Die wesentlichen Methoden für eine Liste sind im Interface List definiert, und daher für ArrayList und LinkedList gleich. 19.11.2015 IT I - VO 7 14
Sets Sets sind Collections: add() size() for each Schleife Achtung: Für Set gibt's keine get-methode! (Zugriff nur über for each Schleife!) 19.11.2015 IT I - VO 7 15
Sets Unterschiede zwischen List und Set: List enthält eine Sequenz von Objekten. Objekte können öfters vorkommen. Set enthält Objekte in keiner bestimmten Reihenfolge (keine get-methode!) Spez. Implementierungen existieren, die eine spezielle Reihenfolge der Objekte einhalten. In Set kommt ein Objekt nur einmal vor. 19.11.2015 IT I - VO 7 16
HashSet Benötigt eine korrekte Implementierung der Methode public int hashcode() in java.lang.object. Die Methode hashcode() gibt im wesentlichen an, wo ein Objekt in einem HashSet gespeichert wird. 19.11.2015 IT I - VO 7 17
hashcode() Um sicherzustellen, dass gleiche Objekte korrekt aufgefunden werden, müssen zwei gleiche Objekte, d.h. x.equals(y) == true, auch den gleichen Hashcode haben, x.hashcode() == y.hashcode(). (Die Umkehrung muss/kann i.a. nicht gelten!!!) 19.11.2015 IT I - VO 7 18
hashcode() Auch für andere Bibliotheksklassen muss hashcode() korrekt implementiert sein. Überschreiben von equals() erfordert das Überschreiben von hashcode()! Eine neue hashcode()-methode verwendet in der Regel die Attribute, die von equals() verwendet werden. z.b.: Kombination der Hashcodes der Attribute mit XOR(^): a1.hashcode() ^ a2.hashcode() ^ a3.hashcode() für Attribute a1, a2, a3. 19.11.2015 IT I - VO 7 19
public boolean equals(object obj) Eine weitere Methode, die in Object definiert (und implementiert) ist. equals() soll true liefern, wenn das Objekt, für das equals() aufgerufen, gleich dem übergebenen Objekt obj ist. Daher sollte equals() die folgenden Eigenschaften haben: obj.equals(obj) == true obj1.equals(obj2) == obj2.equals(obj1) Wenn obj1.equals(obj2)==true und obj2.equals(obj3)==true dann auch obj1.equals(obj3)==true. Das Ergebnis von obj1.equals(obj2) sollte sich nicht verändern, wenn obj1 und obj2 unverändert bleiben. obj.equals(null) == false 19.11.2015 IT I - VO 7 20
Überschreiben von equals() equals(object obj) ist für beliebige Objekte als Argumente definiert. In einer überschreibenden equals()-methode ist in der Regel ein Überprüfen der Klasse von obj und ein Casting notwendig. obj instanceof eineklasse Liefert true, wenn obj ein Objekt von eineklasse ist. 19.11.2015 IT I - VO 7 21
Testing and debugging Eliminate errors by avoiding them in the first place. Carefully design classes, algorithms and methods. Carefully code everything into Java. Test your program with appropriate test cases (some where the answer is known), discover and fix any errors, then retest. 19.11.2015 IT I - VO 7 22
Errors Eliminating errors is called debugging. An error in a program is called a bug. Three kinds or errors Compile errors Runtime errors Logical errors 19.11.2015 IT I - VO 7 23
Compile Errors/Syntax errors Grammatical mistakes in a program. The grammatical rules for writing a program are very strict. The compiler catches such errors and prints an error message. Examples: Using a period instead of a comma. Calling a method which is not defined. 19.11.2015 IT I - VO 7 24
Runtime Errors Errors that are detected when your program is running, but not during compilation. When the computer detects an error, it terminates the program and prints an error message. Examples: Division by 0 Null pointer reference Index out of bounds 19.11.2015 IT I - VO 7 25
Logical Errors Errors that are not detected during compilation or while running, but which cause the program to produce incorrect results. These are the errors which are hard to find. Programs need to be tested to find such errors. 19.11.2015 IT I - VO 7 26
Unit testing Each unit (class, method, constructor) of a program may (and should!) be tested. Finding and fixing errors in units early is much easier than debugging a whole program. For testing you need to understand what the unit should do. You will be looking for violations. One typical kind of error is the incorrect handling of boundary cases: First/last iteration of a loop First/last element of an array Minimal/maximal values Empty/full list 19.11.2015 IT I - VO 7 27
The art and craft of testing Errors are a fact of life in programs. Testing and debugging skills are essential. Make testing a habit. Practice debugging skills. Good testing is a creative process: Which test cases? Build a set of test cases for your units. Rerun the test when the unit is changed (regression testing). Automate testing where possible. Use of test units/test classes. Creativity is focused on creating the test classes. 19.11.2015 IT I - VO 7 28
Specific testing and debugging techniques Use the debugger to view the program execution. Add extra print statements to your program to get information about the execution. Manual walkthrough Verbal walkthrough 19.11.2015 IT I - VO 7 29
Manual walkthrough Get away from the computer and run the program by hand. Tabulate object states (attribute values) An object s behavior is usually determined by its state. Incorrect behavior is often the result of an incorrect state. Document state changes after method calls. 19.11.2015 IT I - VO 7 30
Verbal walkthroughs Explain to someone else what the code is doing. They might spot the error. The process of explaining might help you to spot it for yourself. 19.11.2015 IT I - VO 7 31
clock-display 19.11.2015 IT I - VO 7 32
Spezifikation eines Moduls NumberDisplay Ein Konstruktor, der die Obergrenze für den Zähler definiert, bei der der Zähler wieder auf 0 springt. Eine Methode void increment(), die den Zähler um eins erhöht. Eine Methode int getvalue(), die den Wert des Zählers zurückliefert. Eine Methode void setvalue(int replacementvalue), die den Zähler auf einen bestimmten Wert setzt. Eine Methode String getdisplayvalue(), die den Wert des Zählers als 2-stelligen String zurückliefert. 19.11.2015 IT I - VO 7 33
clock-display Spezifikation Stellt die Uhrzeit in digitaler Form dar. Es gibt eine Methode void settime(int hour, int minute), zum Einstellen der Uhrzeit. Es gibt eine Methode void timetick(), die die Uhr um eine Minute vorrückt. 19.11.2015 IT I - VO 7 34
Abstraktion Abstraktion sieht über Details hinweg und konzentriert sich auf die Gemeinsamkeiten, die dann sichtbar werden. Projekt clock-display: Die Minutenanzeige zählt von 0 59. Die Stundenanzeige zählt von 0 23. Gemeinsamkeit: Ein Zähler, der von 0 bis zu einem Höchstwert zählt, und dann wieder auf 0 springt. 19.11.2015 IT I - VO 7 35
Modularisierung clock-display One four-digit display? Or two two-digit displays? 19.11.2015 IT I - VO 7 36
clock-display Objektdiagramm 19.11.2015 IT I - VO 7 37