Java Schulung - OOP
24. – 28. September 2007
Objektorientierte P. mit Java - Überblick
Objektorientierung
Ein bisschen UML
Verwendung von Objekten (Telefonbuch)
Definieren von Objekten (Computerladen)
Polymorphie
Zugriffsrechte
Abstrakte Klassen und Enums
Streifzug durch die Java-Klassenbibliothek
Exceptions
Dokumentation
Innere und Anonyme Klassen
Objektorientierung - Motivation I
Es ist nicht genug, dass Software funktioniert,
man muss sie auch verstehen!
Aber: Wir verstehen nur einfache Sachen
(gerade in der praktischen Arbeit)
Sprechende Namen für Variablen und Methoden
und Klassen, Einfache Schnittstellen,
Übersichtliche Strukturierung
Strukturierungsmöglichkeiten über Funktionen nicht
ausreichend.
Bekanntes Phänomen des „Spaghetti“-Code
Objektorientierung - Motivation
Aber: Software insgesamt bleibt komplex, also
wollen wir sie wenigstens in verständliche Teile
zerlegen.
Als solche Teile identifizieren wir Klassen von
Objekten, wie in der realen Welt!
(Bankkonto, Benutzer, Fenster, Regel,
Warenkorb, Datenbankschnittstelle..)
Zwei Schritte:
Modellierung Implementierung
(im Kopf, auf Papier, UML)
(Java)
Modellierung (Klassen von Objekten)
Klassen beschreiben, welche Attribute Objekte haben sollen!
Vererbung („Ist-ein“ Beziehung), Assoziazion („hat ein“)
Assoziazionen beschreiben, wie Objekte in Beziehung stehen!
Methoden (Rabattaktion und Inventur)
Interfaces (Schnittstellen ohne Implementierung)
Zusammenfassung UML
Nur an der Oberfläche gekratzt, eigentlich ist UML
ein eigenes umfassendes Thema
Aber soweit: UML hilft uns die Objektklassen für die
Programmierung zu beschreiben!
Standardisiert und bekannt!
Objekte haben Eigenschaften und stellen Methoden
bereit, die aufgerufen werden können.
Objekte selbst sind zuständig für Berechnungen
(Methodenaufrufe)
Vererbung und Assoziationen bilden Beziehungen
zwischen Objektklassen ab
Nochmal zu Klassen und Objekten
Klassen
Haben Attribute mit festgelegten Datentypen (etwa wie ein
Databankschema)
Sind selbst Datentypen (für Variablen oder Methoden-
Parameter)
Bieten Methoden an, die Berechnungen auf Instanzen
durchführen.
Objekte
Sind Instanzen einer Klasse und haben individuelle Werte
für jedes Attribut (Analogie: Datensatz)
Können als Werte im Programm verwendet werden.
JAVA: Verwendung von Objekten
Erzeugung von Objekten
Syntax new <klassenName>(<argumente>);
Zuweisung zu einer Variable
Methodenaufruf
In diesem Objekt wird eine Methoden aufgerufen.
Syntax <objectvariable>.<methodenname>(<argumente>);
Erstellen einer Klasse (Beispiel Store)
Attributsdeklaration (ähnlich wie Variablendecl)
Nicht „static“!
Initialisierung von Attributen.
Konstruktor mit Parametern
Deklaration eines Interfaces
Unterschiede zur Klassendefinition
Schlüsselwort „interface“ statt „class“
Keine Attribute erlaubt (Ausnahme Konstanten: „static final“)
Nur Signaturen ohne Implementierungsblock!
LinkedList – Klasse für verkettete Liste
Templates <> zur genaueren Ausprägung
Was fehlt beim Store ? der Klasse
Iteratoren – Der „Java-Way“ zum
Laufen über Listen.
Wir implementieren einen Computer
Implementierung eines
Interfaces!
this = Referenz auf
das „Selbst“-Objekt!
Livedemo mit extensiver Autokorrekur (Ctrl-Space .. Ctrl-1)
Vererbung beim Notebook
Schlüsselwort „extends“ - Notebook erweitert,
bzw. „erbt von“ Computer
Aufrufe der Elternklasse
mit „super“
Methode der Vaterklasse wird
Überschrieben!
Namenskonventionen:
setter und getter
Klassenhierarchie
F4
Besonderheiten: Vererbung in Java
Nur Hinzufügen (Attribute, Methoden) möglich, kein
entfernen.
Keine Mehrfachvererbung (erben von zwei Klassen) in
Java möglich
Klassen-Attribute (static) sind zugreifbar haben aber
keinen individuellen Wert.
Konstruktoren werden nicht vererbt, können aber mit
super aufgerufen werden
Jede Klasse wird implizit von einer Klasse Object
abgeleitet (und erbt equals und hashCode)
Polymorphie was ist das?
Beispiel: Herr Müller ist nicht am Zahn der Zeit und kennt keine
Autos mit Navigationssystem. Er bekommt in einer Autovermietung
einen neuen Audi mit Navigation. Herr Müller kennt dieses spezielle
Modell nicht und weiss nicht mit den neuen Funktionen umzugehen.
Da er jedoch das allgemeine Konzept Auto kennt, weiss er dieses
dennoch zu gebrauchen.
Übertragung auf die Programmierung:
Objekte können auch Variablen von Elternklassen/
Interfaces des Objektes zugewiesen werden
Auto auto = new Audi(); [Link]();
Audi a4 = new Auto();
Aquivalentes gilt für Methodenparameter:
[Link](new Audi());
audihä[Link](new Auto());
Verwandtes Thema: Dynamische Bindung / Statische Bindung
Typüberprüfung und cast
Hier können es noch
alle Autotypen sein
Test auf Typ
Typwandlung
(cast)
Immer erlaubt: Zuweisung eines Objektes einer spezielleren Klasse
Nur mit cast: Zuweisung eines Objektes einer allgemeineren Klasse
Syntaxfehler wenn kein Pfad in der Vererbungshirarchie,
Laufzeitfehler bei ungültigem Cast
Zugriffsrechte - Sichtbarkeit
Schlüsselwörter „public“ und „private“ haben wir
bisher einfach so hingenommen.
Zugriffsrechte bei Klassen
public : Klassen können von überall her benutzt werden
<Ohne>: Klassen können nur im selben Paket
verwendet werden.
Zugriffsrechte bei Methoden
public: Methoden können von allen Objekten
aufgerufen werden
private: Methoden sind nur innerhalb derselben
Klasse bekannt
protected:Methoden sind bekannt innerhalb des Paketes
und in abgeleiteten Klassen
<Ohne>: Methoden sind nur innerhalb des Paketes
bekannt
Richtlinien:
Hilfsfunktionen „privat“, Interfacefunktionen „öffentlich“
„Verstecke“ alles, solange es geht!
Beispiel Nur innerhalb von „Notebook“ sichtbar.
Methode offen für
externe Klasen!
Abstrakte Klassen
Abstrakte Klasse = Mischung aus Klasse und
Interface.
Schlüsselwort „abstract“ vor der Klasse
dürfen Methoden als abstrakt deklarierten (ohne Body)
können nicht mit new instantiiert werden
müssen vor Benutzung erweitert werden
Namenskonvention: häufig „Abstract“ im Namen der Klasse
Vergleich mit Interfaces
Bei Interfaces wird nur das Protokoll (die Signaturen)
übernommen, bei Abstrakten K. wird das Grundverhalten
vererbt
Bei Interfaces ist Mehrfach-Polymorphie möglich
Interfaces müssen immer public sein
Beispiel einer abstrakten Klasse
Unspezifisches Produkt soll nicht instantiiert
werden können!
Allgemeines Verhalten, muss nicht in jeder
ableitenden Klasse erneut implementiert werden!
Spezielles Verhalten, soll in ableitenden
Klassen explizit produktspezifisch
angegeben werden!
Die implementierende Klasse
Enums (seit Java 1.5)
Aufzählungstyp
Java - Klassenbibliothek
Beim Programmieren wollen wir das Rad nicht
neu erfinden.
Irgendwo gibt es schon eine „beste Lösung“.
Wichtige Sachen werden in der Java-
Klassenbibliothek bereitgestellt
Weitere Klassenbibliotheken (Open-Source
oder kommerziell) können eingebunden
werden.
Java Klasssenbibliothek – Wo findet man was ?
Paket Funktion
[Link]: Ein-/Ausgabe (Streams, Dateien, ...)
[Link]: Basis-Klassen (System, Object, Runtime, String, ...)
[Link]: Java Reflection API (Introspektion, ...)
[Link] Allerlei Hilfsklassen (Random, Listen, Maps…)
[Link]: Alles für Java-Applets
[Link]: Graphische Oberflächen mit AWT
[Link] Graphische Oberflächen mit Swing
….
[Link]
allgemeines Interface für den standardisierten Zugriff
auf verschiedene Implementierungen
LinkedList (Leichtes Hinzufügen, Löschen)
ArrayList (Effizienter Random-Zugriff)
Methoden
boolean add(Object obj);
Object remove(int pos);
void contains(Object obj);
Object get(int pos);
…
[Link]
Jeder Listentyp liefert bei Bedarf einen Iterator
Einschränkung des Zugriffs
Originalliste nicht veränderbar (Objekte in der Liste
schon!)
Methoden
boolean hasNext();
Object next();
…
[Link]
Einfache Operationen in String-Klasse eingebaut:
char charAt(int pos)
Buchstaben an Position pos+1 (in Java immer 0..n-1)
boolean equals(String s)
Gleichheitstest
boolean startsWith(String s)
selbstredend..
int length();
Länge ges Strings
String replace(char alt, char neu);
ersetzt Zeichen im String
String substring(int vonIndex, int bisIndex);
Liefert einen Teilstring
Klasse StringTokenizern, Pattern
Praktisch zum Verarbeiten von Stringeingaben
Splitten von Strings nach Trennern, Mustererkennung (regex)
[Link], Double, Float
Die Primitiven Datentypen int, double, float gibt es auch
als Klassen (ContainerKlassen, Wrapper-Klassen)
Erkennbar daran, dass sie mit Grossbuchstaben
beginnen.
Konvertiertung ineinander klassisch:
Erzeugung mit Konsturktor
Methoden intValue(), doubleValue(),..
Konvertierung neu seit Java :
Autoboxing, Autounboxing
Nützlich:
Teil der Vererbungshierarchie, kann übergeben werden, wenn
Object erwartet wird
Z.B. in Generics (new HashMap<String, Integer>();)
Parsen von Stringwerten ([Link](s);)
Exceptions - Kontrollierte Fehlerbehandlung
Programmierer kann nicht alle Fehler verhindern
sollte aber geeignet auf Fehler reagieren, z.B.
USB-Stick wird abgezogen während davon gelesen wird.
Netzwerkverbindung bricht zusammen
Bei der String zu Int-Konvertierung wird ein Buchstabe
angetroffen…
Designfragen bei Fehler in Methoden:
Wahl der Reaktion auf einen Fehler!
Defaultwert zurückgeben,
Nicht verwendeten Wert zurückgeben
Programmterminierung (C++)
Zuständigkeit der Fehlerbehebung
Programmierer der aufgerufenen Methode
Programmierer der aufgerufenden Methode
Lösung: Exceptions
Beispiel 1 - Zahlenformatierung
Auswirkungen beim Auftreten eines Fehlers
Restliche Anweisungen des Try-blocks werden übersprungen
Catch-Block wird ausgeführt
Bearbeitung geht nach try-catch Weiter
Effekte
Kontrollierte Reaktion beim Aufrufer möglich
Beispiel 2 – Fehler weiterreichen
Throws Deklaration
Zeigt an, dass dieser Fehler auftreten kann
Bewirkt, dass wir Fehler nicht mit try-catch fangen müssen
Effekte
Verantwortung für Fehlerbehandlung wird abgegeben!
Beispiel 3 – Eigene Exceptions erzeugen!
Schritte
Eigene Fehlerklasse von der Klasse Exception ableiten.
Methodensignatur um throws erweitern
Beim Fehler diesen mit throw werfen.
Dokumentieren in JAVA - Überblick
Arten der Doku
Dokumentation des Protokolls (sehr wichtig)
Dokumentation der Implementierung (bei im Code, Bedarf)
Folgender Inhalt
Java-Bezeichnerkonventionen
Dokumentation der Implementierung
Dokumentation des Protokolls / javadoc
Java-Bezeichnerkonventionen (Wiederholung)
Klassen:
Erster Buchstabe jeweils groß
[Link]
ACXFramework
Attribute / Variablen:
Erster Buchstabe klein, Anfangsbuchstaben neuer Worte groß
minimumRange
maximumValue
Methoden:
Erster Buchstabe klein, Anfangsbuchstaben neuer Worte groß
createWindow
lockDatabase
Konstanten:
Komplette Großschreibung, Wörter mit „_“ getrennt.
SSL_PORT
PI
Javadoc – Kommentieren von Methoden/Klassen
JavaDoc ist Teil der Java-Distribution und generiert statische Webseiten
zur Dokumentation aus den Kommentaren im Quelltext
Kommentare im muss entsprechend standardisiert aufbereitet sein
Eclipse generiert java-doc-konforme Kommentare „/** <return>“
Schlüsselwörter:
@version <text>
@author <text>
@param <name> <beschreibung>
@return <beschreibung>
@throws <klassenname> <beschreibung>
Generieren der HTML-Doku aus Eclipse:
Projekt – Generate JavaDoc
JavaDoc in Anwendung
Generierte API-Dokumentation
Zusammenfassung -Dokumentation
Verschiedene Dokumenationsformen
Javadoc, Gute Benamung, Quellcode-Kommentare
TODO‘s als temporäre Hilfestellung (Namen des Entwicklers, Jira-
Referenz, zum Release alle Todos entfernen)
Dokumentation dient der..
Wartbarkeit des eigenen Codes
Benutzung des Codes durch
Richtiges „Augenmaß“ gefragt
Getter und Setter muss man nicht Dokumentieren
Öffentliche Schnittstellen muss man unbedingt dokumentieren
Dazwischen liegt ein großer Bereich in dem es nach dem eigenen
Ermessen geht
Was gibt es noch hübsches?
Innere Klassen
Komplette Klassen, die aber in eine andere Klasse
geschachtelt sind.
Zugriff mit <äussereKlasse>.<innereKlasse>
Strukturierungsmittel
Nur bei „kleinen“ Hilfs-Klassen verwenden,
ansonsten ist eine neue Klasse vorzuziehen.
Anonyme Klassen
Können spontan innerhalb von Methoden definiert
werden.
Kein Namen, kein Construktor
Werden von einem Interface/Klasse abgeleitet.
Genug Stoff für heute…
Fragen??