Interface Comparator - Generische Klassen Heute
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Heute • Exceptions • Enumerations • Generische Klassen • Interface Comparator • Grafische Benutzeroberflächen • (Anonyme) innere Klassen • main / ausführbare jar-Files 14.01.2021 OOP - VO 13 1
Organisatorisches • Heute letzte VO-Einheit • VO-Prüfung am Do 21.1., ab 8:30 (online) → Anmeldung über MU Online • anschließend letzte UE mit Wissensüb. • UE-Abschlusstest am 28.1. (online) • Bei Fragen → Tutorium UE wird evaluiert. Nehmen Sie teil! 14.01.2021 OOP - VO 13 2
Stoff VO-Prüfung • equals, hashCode, Comparable • abstrakte Klassen, Interfaces • Collection, Set, List • Map • Call by value / Call by reference • Vererbung (inkl. Klasse Object) • enum • Exceptions & Errors • Wrapper-Klassen • Rekursion • CuP-Stoff 14.01.2021 OOP - VO 13 3
Generische Klassen Generische Klassen selbst erstellen: class MyList { ... } (T steht hier für einen beliebigen Datentyp) 14.01.2021 OOP - VO 13 4
Enumeration types (1) • Enumeration types sind definiert durch die Aufzählung einer festen Anzahl von Möglichkeiten, z.B. enum Wochentag{ MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG } • Beispiel zum Umgang mit Objekten eines Enumeration Types: Wochentag einTag = Wochentag.DIENSTAG; 14.01.2021 OOP - VO 13 5
Enumeration types (2) • Enumeration types sollten immer dann verwendet werden, wenn es eine fixe und kleine Anzahl von möglichen Werten gibt. • Java bietet weitere Möglichkeiten bei der Verwendung von Enumerations types (vgl. Bsp. Planeten). • Formal wird durch einen Enumeration type eine Klasse definiert mit den entsprechenden statischen Konstanten. 14.01.2021 OOP - VO 13 6
Enumeration types (3) • Enumeration types können Attribute, entsprechenden Konstruktor und Methoden haben. • Konstruktor ist nicht public, da von Enumeration type keine Objekte erzeugt werden. • Jeder Enumeration type hat Methode values(), die ein Array der verschiedenen Werte zurückgibt. 14.01.2021 OOP - VO 13 7
Fehler (Errors) Drei Arten von Fehlern: • Compilerfehler • Laufzeitfehler (Runtime errors) • Logische Fehler 14.01.2021 OOP - VO 13 8
Errors und Exceptions • Exceptions erlauben eine einheitliche Behandlung von Sonderfällen. • Exceptions und Errors sind in einer Vererbungshierarchie organisiert. • Errors: Wesentliche Fehler des Laufzeitsystems, die vom Anwendungsprogramm in der Regel nicht behoben werden können. 14.01.2021 OOP - VO 13 9
Exceptions und Errors 14.01.2021 OOP - VO 13 10
Exceptions • Geprüfte (checked) Exceptions: – Besondere Bedingungen insbesondere der Systemumgebung, z.B. IOException. – Für diese Exceptions muss eine Fehlerbehandlung vorgesehen werden. • Ungeprüfte (unchecked) Exceptions (=RuntimeExceptions): – Weisen in der Regel auf Programmfehler hin. – Für RuntimeExceptions muss keine Fehlerbehandlung vorgesehen sein. 14.01.2021 OOP - VO 13 11
Fehlerbehandlung • Methoden (und Konstruktoren), bei denen eine checked Exception auftreten kann, müssen diese im Methodenkopf angeben, z.B.: void writeObject(Object ob) throws IOException • Wenn eine aufgerufene Methode eine Exception wirft, kann die aufrufende Methode – diese weitergeben, – oder in einem try-Block abfangen. • Beim Weitergeben muss die Exception im Methodenkopf der aufrufenden Methode angegeben werden. 14.01.2021 OOP - VO 13 12
try-Block try{ Anweisungsblock; }catch(IOException e){ Fehlerbehandlung1; }catch(ClassNotFoundException e){ Fehlerbehandlung2; } Tritt im Anweisungsblock eine Exception auf, wird der Anweisungsblock abgebrochen und die entsprechende Fehlerbehandlung durchgeführt: Es wird die Fehlerbehandlung der ersten passenden catch-Anweisung durchgeführt. 14.01.2021 OOP - VO 13 13
java.io.* • Wichtige Klassen: – FileWriter, FileReader, Buffered Reader – FileOutputStream, FileInputStream – ObjectOutputStream, ObjectInputStream • Interface Serializable: – Nur Klassen, die Serializable implementieren, können auf Streams geschrieben werden. – Serializable erfordert keine Implementierung von Methoden („Marker-Interface“). • Nur ein sehr kleiner Ausschnitt der Möglichkeiten von Ein-/Ausgabe auf externe Geräte (Files, Netzwerk, …) mit Java. 14.01.2021 OOP - VO 13 14
Serializable • Files sind eine sequentielle Anordnung von Daten. • Objekte mit ihren Objekt-Referenzen können eine komplizierte Struktur haben. • Um Objekte in ein File zu schreiben, müssen die Daten sequentiell angeordnet werden. • Java erledigt das automatisch für alle Klassen, die Serializable implementieren. • Nur Objekte von Klassen die Serializable implementieren, können auf einen Stream geschrieben werden. • Dabei werden auch (rekursiv) alle Objekte, auf die es vom geschriebenen Objekt aus Referenzen gibt, auf den Stream geschrieben. • Serializable erfordert keine Implementierung von Methoden, es ist ein „Marker-Interface“. 14.01.2021 OOP - VO 13 15
IO-Klassen • FileOutputStream, FileInputStream stellen die Verbindung zu einem File für das Schreiben oder Lesen her. • ObjectOutputStream,ObjectInputStream ermöglichen das Schreiben von Objekten und primitiven Datentypen auf einen OutputStream (bzw. das Lesen von einem InputStream). – Die relevanten Methoden sind • writeObject(), readObject() • writeInt(), readInt(), … 14.01.2021 OOP - VO 13 16
Grafische Oberflächen (GUI) • Pakete awt (alt) und swing (neu) enthalten Klassen für GUIs. • swing verwendet einige Klassen aus awt, sodass meist beide importiert werden müssen. • Klassennamen in swing, die Klassen aus awt ersetzen, beginnen typischerweise mit einem 'J' (z.B. JFrame ersetzt Frame). 14.01.2021 OOP - VO 13 17
GUI: Wichtige Klassen und Methoden • JFrame ist Klasse für Fenster. Konstruktor erzeugt leeres, unsichtbares Fenster. • Auf Inhalt des Fensters wird mit Container getContentPane() zugegriffen. • Mit setVisible(boolean) kann Fenster (un)sichtbar gemacht werden. 14.01.2021 OOP - VO 13 18
GUI: Wichtige Klassen und Methoden • Klassen für Steuerelemente u.ä.: JButton, JLabel, JTextField, JmenuBar, ... • Steuerelemente können dem Inhalt (Objekt der Klasse Container) des Fensters mit add hinzugefügt werden. • Damit mehrere Elemente sichtbar, muss mit setLayout() die Anordnung festgelegt werden. 14.01.2021 OOP - VO 13 19
GUI: Benutzinteraktion • Für jedes Steuerelement gibt es ein oder mehrere “Listener”-Interfaces, die Methoden vorgeben, die ausgeführt werden, wenn der Benutzer bestimmte Aktionen durchführt (Mausklick, Eingabe, o.ä.). • Die Steuerelemente müssen mit den entsprechenden “Listeners” verknüpft werden. 14.01.2021 OOP - VO 13 20
GUI: Benutzinteraktion Beispiel: JButton knopf=new Jbutton(“press”); • Damit Button reagiert, implementiere Interface ActionListener und (über)schreibe Methode void actionPerformed(Event e) • Button mit Listener verknüpfen: knopf.addActionListener(this); 14.01.2021 OOP - VO 13 21
Innere Klassen • Um Fallunterscheidungen bei Benutzerinteraktion zu vermeiden (welches Steuerelement hat Ereignis ausgelöst?), können innere Klassen verwendet werden. • Diese Klassen sind nur innerhalb der umschließenden Klasse bekannt, können aber auf Attribute der umschließenden Klasse zugreifen. 14.01.2021 OOP - VO 13 22
Innere Klassen Beispiel: class EinFenster{ JButton knopf = new JButton(...); knopf.addActionListener(new Innen()); // innere Klasse class Innen implements ActionListener { public void actionPerformed(...) {...} } } 14.01.2021 OOP - VO 13 23
Anonyme innere Klassen • Da von inneren Klassen meist nur ein Objekt erzeugt wird, gibt es die Möglichkeit, innere Klassen anonym zu machen. • In diesem Fall wird an Ort und Stelle der (anonyme) Konstruktor des zu erzeugenden Objekts aufgerufen und die entsprechende Methode implementiert. 14.01.2021 OOP - VO 13 24
Anonyme innere Klassen Beispiel: class EinFenster{ JButton knopf = new JButton(...); knopf.addActionListener( // Konstruktoraufruf der anonymen // inneren Klasse new ActionListener(){ public void actionPerformed(...) {...} }); } 14.01.2021 OOP - VO 13 25
Interface Comparator • Alternativ zum Interface Comparable kann über das Interface Comparator eine Reihung von Objekten einer Klasse festgelegt werden. • Diese Reihung kann von Sortiermethoden der Klassen Arrays und Collections oder durch Klassen wie TreeSete oder TreeMap verwendet werden. • Anders als Comparable wird das Interface Comparator in einer beliebigen Klasse implementiert. Dadurch lassen sich auch Objekte bereits gegebener Klassen sortieren bzw. verschiedene Sortierkriterien angeben. 14.01.2021 OOP - VO 13 26
Interface Comparator In der Klasse, die das Interface Comparator implementiert, muss die Methode int compare(T t1, T t2) so überschrieben werden, dass • ein Wert t2. • Der Wert 0 zurückgegeben wird, wenn t1.equals(t2)==true. 14.01.2021 OOP - VO 13 27
Interface Comparator • Um einen Comparator zu verwenden, muss der Konstruktor einer das Interface implementierenden Methode aufgerufen werden. • Das entsprechende Objekt wird der Sortiermethode o.ä. übergeben, z.B. class CompB implements Comparator {…} ArrayList liste = …; Collections.sort(liste, new CompB()); 14.01.2021 OOP - VO 13 28
Interface Comparator • Alternativ können auch (anonyme) innere Klassen verwendet werden, z.B. ArrayList liste = …; Collections.sort(liste, new Comparator(){ public int compare(Blub b1, Blub b2) { ... } }); 14.01.2021 OOP - VO 13 29
public static void main(String[] args) • Definiert die „Hauptmethode“ einer Klasse. • Diese Methode wird ausgeführt, wenn das Java-Laufzeitsystem mit dieser Klasse als Input gestartet wird. • Z.B. java TestKlasse • Dazu muss TestKlasse.class im entsprechenden Verzeichnis vorhanden sein, und in Testklasse eine main-Methode definiert sein. • Alle weiteren benötigten Klassen müssen ebenfalls als class-Files vorhanden sein. • Im String-Array args können Argumente zur Verfügung gestellt werden. 14.01.2021 OOP - VO 13 30
Ausführbares jar-File • In BlueJ kann ausführbares jar-File erstellt werden. • Dazu muss Klasse angegeben werden, die main-Methode enthält. • jar-File kann durch Doppelklick ausgeführt werden, wenn JDK und JRE auf Rechner installiert und mit jar-Files verknüpft. 14.01.2021 OOP - VO 13 31
Sie können auch lesen