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 1Organisatorisches
• 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 2Stoff 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 4Enumeration 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 5Enumeration 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 6Enumeration 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 7Fehler (Errors)
Drei Arten von Fehlern:
• Compilerfehler
• Laufzeitfehler (Runtime errors)
• Logische Fehler
14.01.2021 OOP - VO 13 8Errors 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 9Exceptions 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 11Fehlerbehandlung
• 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 12try-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 13java.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 14Serializable
• 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 15IO-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 16Grafische 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 17GUI: 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 18GUI: 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 19GUI: 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 20GUI: 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 21Innere 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 22Innere 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 23Anonyme 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 24Anonyme 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 25Interface 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 26Interface 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 27Interface 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 28Interface 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 29public 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 30Ausfü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 31Sie können auch lesen