TIAI1004: Programmierung Teil 8: Objektorientierte Programmierung (III) Berufsakademie Stuttgart/Horb Studiengang Angewandte Informatik Dozent: Olaf Herden Stand: 06/2008 TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8-1 Olaf Herden 06/2008 Gliederung • Operatoren this/super/instanceof • Parameterübergabe • Beziehungen zwischen Klassen • Schnittstellen • Polymorphie • Kopieren von Objekten • Klassenbibliotheken TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8-2 Olaf Herden 06/2008 this-Operator: Motivation (I) • Szenario 1: (1) public class Mitarbeiter{ (2) (3) private int persNr; (4) private String name; (5) (6) public Mitarbeiter(String name, int persNr){ (7) ... (8) } (9) } • • • Im Rumpf des Konstruktors kommt es zum Namenskonflikt Die beiden Attribute persNr und name sind sowohl als Instanz- als auch als Übergabeattribute in der Parameterliste deklariert Es muss gelöst werden: - Um welches Attribut es sich handelt, wenn im Rumpf des Konstruktors nun persNr bzw. name verwendet wird - Wie das andere Attribut mit der Bezeichnung persNr bzw. name angesprochen wird TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8-3 Olaf Herden 06/2008 this-Operator: Motivation (II) • Szenario 2: ( 1) public class Mitarbeiter{ ( 2) ( 3) private int persNr; ( 4) private String name; ( 5) private String ort; ( 6) ( 7) public Mitarbeiter(String name, int persNr){...} ( 8) public Mitarbeiter(String name, int persNr, ( 9) String ort){ (10) ... (11) } (12) } • • • Der zweite Konstruktor ist eine Obermenge des ersten Wünschenswert: Der zweite Konstruktor ruft den ersten auf Anweisung Mitarbeiter(name,persNr); im Rumpf des zweiten Konstruktors scheitert jedoch TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8-4 Olaf Herden 06/2008 this-Operator: Lösung (I) • • • Abhilfe schafft in beiden Szenarien der this-Operator, der auf das aktuelle Objekt zeigt Mit Hilfe dieses Operators können nun die beiden Szenarien gelöst werden Szenario 1: Über this lassen sich nun die Objektvariablen ansprechen ( 1) public class Mitarbeiter{ ( 2) ( 3) private int persNr; ( 4) private String name; ( 5) ( 6) public Mitarbeiter(String name, int persNr){ ( 7) this.persNr = persNr; ( 8) this.name = name; ( 9) } (10) } Ansprechen der Objektvariablen TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Ansprechen der lokalen Variablen Objektorientierte Programmierung III 8-5 Olaf Herden 06/2008 this-Operator: Lösung (II) • Szenario 2: Über this lässt sich nun der erste Konstruktor aus dem Rumpf des zweiten heraus aufrufen: ( 1) public class Mitarbeiter{ ( 2) ( 3) private int persNr; ( 4) private String name; ( 5) private String ort; ( 6) ( 7) public Mitarbeiter(String name, int persNr){...} ( 8) public Mitarbeiter(String name, int persNr, ( 9) String ort){ (10) this(name, persNr); (11) this.ort = ort; (12) } (13) } Aufruf des ersten Konstruktors TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8-6 Olaf Herden 06/2008 super-Operator: Motivation • Szenario: (1) public class Mitarbeiter{ (2) ... (3) public void drucken(){ (4) System.out.println(persNr); (5) System.out.println(name); (6) ... (7) } (8) } (1) public class Arbeiter extends Mitarbeiter{ (2) private float stundensatz; Das alles ist schon in der (3) public void drucken(){ Oberklasse geschehen (4) System.out.println(persNr); (5) System.out.println(name); (6) ... (7) System.out.println(stundensatz); (8) } (9) } • Methode drucken() in der Unterklasse wiederholt jede Menge Arbeit der gleichnamigen Methode der Oberklasse • Wünschenswert: Methode der Oberklasse in der Unterklasse aufrufen Olaf Herden TIAI1004: Programmierung Objektorientierte Programmierung III 8 7 06/2008 Berufsakademie Stuttgart/Horb super-Operator: Lösung • Abhilfe schafft der Operator super, der auf die Oberklasse verweist • Damit lässt sich das Szenario folgendermaßen lösen: (1) public class Arbeiter extends Mitarbeiter{ (2) private float stundensatz; Damit wird die Methode (3) public void drucken(){ drucken() der Ober(4) super.drucken(); klasse aufgerufen (5) System.out.println(stundensatz); (6) } (7) } TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8-8 Olaf Herden 06/2008 super-Operator: Konstruktor • Mit super kann auch ein Konstruktor der Oberklasse aufgerufen werden • Beispiel: (1) public class Mitarbeiter{ (2) ... (3) public Mitarbeiter(String name,int persNr,String ort){ (4) this(name,persNr); (5) this.ort=ort; (6) } (7) } (1) public class Arbeiter extends Mitarbeiter{ (2) ... (3) public Arbeiter(String name,int persNr,String ort, (4) int stundenSatz){ (5) super(name, persNr, ort); (6) this.stundenSatz = stundenSatz; (7) } (8) } Aufruf des Konstruktors der Oberklasse TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8-9 Olaf Herden 06/2008 super-Operator: Anmerkungen • Insgesamt gelten für super in Verbindung mit Konstruktoren folgende Regeln: - Jede Unterklasse muss einen Konstruktor definieren, der einen Konstruktor der Oberklasse mittels super als erste Anweisung des Konstruktorrumpfes aufzurufen - Ausnahme: Wenn die Oberklasse einen parameterlosen Konstruktor besitzt, wird dieser automatisch aufgerufen • Anmerkung: - Mehrstufiger Aufruf super.super.<methode> ist verboten TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 10 Olaf Herden 06/2008 instanceof-Operator (I) • • • • Mit dem instanceof-Operator lässt sich die Zugehörigkeit eines Objektes zu einer Klasse feststellen Syntax: <Objektname> instanceof <Klassenname> Semantik: Zurückgegeben wird true, falls das Objekt Instanz der Klasse (oder einer Oberklasse) ist, ansonsten false Beispiel: Es seien wieder die Klassen Mitarbeiter und Arbeiter wie auf den letzten Folien definiert TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 11 Olaf Herden 06/2008 instanceof-Operator (II) ( 1) public class Anwendung{ ( 2) ( 3) public static void main(String[] args){ ( 4) ( 5) Mitarbeiter meier = new Mitarbeiter(); ( 6) Arbeiter mueller = new Arbeiter(); ( 7) ( 8) System.out.println(meier instanceof Mitarbeiter); ( 9) System.out.println(meier instanceof Arbeiter); (10) System.out.println(mueller instanceof Mitarbeiter); (11) System.out.println(mueller instanceof Arbeiter); (12) } (13) } führt zur Ausgabe true false true true TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 12 Olaf Herden 06/2008 Übersicht • Operatoren this/super/instanceof • Parameterübergabe • Beziehungen zwischen Klassen • Schnittstellen • Polymorphie • Kopieren von Objekten • Klassenbibliotheken TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 13 Olaf Herden 06/2008 Übergabe von Parametern (I) • Beim Aufruf vom Methoden können die Parameter prinzipiell auf zwei Arten übergeben werden: - Call by Value: Wertübergabe, d.h. der übergebene Wert wird kopiert, Änderungen an diesem Wert bleiben nach außen folgenlos - Call by Reference: Referenzübergabe, d.h. der übergebene Wert wird nicht kopiert, sondern lediglich eine Referenz (ein Verweis) auf diesen Wert, Änderungen innerhalb der Methode werden nach außen sichtbar • In Java ist dies folgendermaßen festgelegt: - Primitive Typen (z.B. int oder float) werden mittels Call by Value übergeben - Objekte werden mittels Call by Reference übergeben TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 14 Olaf Herden 06/2008 Realisierung in Java (I): Beispiel • Das Programm ( 1) public class Ueber{ ( 2) static void veraendern(int i, Mitarbeiter m){ ( 3) i = i + 5; ( 4) m.setPersNr(4712); ( 5) } ( 6) ( 7) public static void main(String[] args){ ( 8) int j = 7; ( 9) Mitarbeiter meier = new Mitarbeiter("Meier",4711); (10) veraendern(j,meier); (11) System.out.println(j); (12) System.out.println(meier.getPersNr()); (13) } (14) } führt zur Ausgabe 7 4712 TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Call by Value: Addition in der Methode verändern bleibt nach außen wirkungslos Call by Reference: Manipulation in der Methode verändern wird nach außen wirkungsam Objektorientierte Programmierung III 8 - 15 Olaf Herden 06/2008 Realisierung in Java (II): Erläuterung • • In der main()-Methode werden eine Variable primitiven Typs (j vom Typ Integer) und ein Objekt (meier als Instanz der Klasse Mitarbeiter) angelegt Dann wird die Methode veraendern() aufgerufen: - Von j wird in i eine Kopie angefertigt - Für m wird lediglich ein Verweis auf meier angelegt verändern Mitarbeiter Verweis i m Kopieren Objekt y main j meier Stack Heap - In der Methode veraendern() werden beide Variablen manipuliert - Änderungen an m wirken sich auch auf den Übergabeparameter aus TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 16 Olaf Herden 06/2008 Übersicht • Operatoren this/super/instanceof • Parameterübergabe • Beziehungen zwischen Klassen • Schnittstellen • Polymorphie • Kopieren von Objekten • Klassenbibliotheken TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 17 Olaf Herden 06/2008 Beziehungen zwischen Klassen • • • Bisher: Klassen konnten ein einem Ober-/Unterklasse-Verhältnis zueinander stehen Auch andere Beziehungen zwischen Klassen denkbar Beispiel: Abteilung Mitarbeiter • <Attributbereich> <Attributbereich> <Methodenbereich> <Methodenbereich> Klassen haben Bezug zueinander: - Mitarbeiter gehören zu einer Abteilung - Abteilungen haben Mitarbeiter • • • Dieses lässt sich aber nicht als Vererbung darstellen, denn weder spezialisiert Mitarbeiter eine Abteilung noch umgekehrt Als allgemeinerer Beziehungstyp steht die Assoziation zur Verfügung Darstellung: Einfache Kante zwischen den beiden Klassen TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 18 Olaf Herden 06/2008 Assoziation (I) Abteilung Mitarbeiter • • <Attributbereich> <Attributbereich> <Methodenbereich> <Methodenbereich> Damit ist der Beziehungstyp Assoziation dargestellt Wünschenswert wären noch weitere Angaben: - Wie viele Mitarbeiter kann eine Abteilung haben? - Zu wie vielen Abteilungen kann ein Mitarbeiter gehören? • • • Dazu werden an der Assoziationskante Multiplizitäten (Kardinalitäten) eingeführt, die die Anzahl der an der Assoziation teilnehmenden Objekte angeben Angegeben werden Mindest- und Maximalzahl, getrennt durch „...“ (Bsp.: 3 ... 7) Regeln: - Entsprechen sich Mindest- und Maximalzahl, so wird nur dieser Wert geschrieben (Bsp.: 5 ... 5 enstpricht 5) - Ist die Maximalzahl unbestimmt, so wird das Symbol „*“ verwendet (Bsp.: 1 ... *) TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 19 Olaf Herden 06/2008 Assoziation (II): Beispiele Abteilung Mitarbeiter <Attributbereich> 1 ... * <Attributbereich> 1 <Methodenbereich> <Methodenbereich> • • „Eine Abteilung hat mindestens eine bis beliebig viele Mitarbeiter“ „Ein Mitarbeiter gehört zu genau einer Abteilung“ Abteilung Mitarbeiter <Attributbereich> 3 ... * <Attributbereich> 1 <Methodenbereich> <Methodenbereich> • • „Eine Abteilung hat mindestens drei bis beliebig viele Mitarbeiter“ „Ein Mitarbeiter gehört zu genau einer Abteilung“ Abteilung Mitarbeiter <Attributbereich> <Methodenbereich> • • 5 ... 8 <Attributbereich> 0 ... 1 <Methodenbereich> „Eine Abteilung hat mindestens fünf, aber höchstens acht Mitarbeiter“ „Ein Mitarbeiter gehört zu einer oder keiner Abteilung“ Olaf Herden TIAI1004: Programmierung Objektorientierte Programmierung III 8 20 06/2008 Berufsakademie Stuttgart/Horb Assoziation (III): Rollen • Manchmal ist es wünschenswert, welcher Art die Assoziation ist, d.h. welche Rolle die Objekte in ihr spielen, z.B. - „Eine Abteilung besteht aus Mitarbeitern“ - „Ein Mitarbeiter arbeitet in einer Abteilung“ • In der UML können Assoziationen mit Rollen versehen werden Abteilung Mitarbeiter <Attributbereich> <Methodenbereich> • 1 ... * arbeitet in besteht aus <Attributbereich> 1 <Methodenbereich> Anmerkung: Häufig sind die Rollenbezeichnungen offensichtlich oder tragen recht allgemeine Bezeichnungen (hat, besteht aus, ...) und werden daher weggelassen TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 21 Olaf Herden 06/2008 Assoziationen in Java • • In Java lassen sich Assoziationen darstellen, indem die Elemente der assoziierten Klasse mit in die Klasse aufgenommen werden Beispiel: (1) public class Mitarbeiter{ (2) ... (3) private Abteilung abt; (4) ... (5) } (1) public class Abteilung{ (2) ... (3) private Mitarbeiter[] mit; (4) ... (5) } TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Bei einer Assoziation mit Multiplizität 1 kann ein Attribut der anderen Klasse eingetragen werden Hier wird ein komplexerer Datentyp (z.B. Feld) benötigt, um bei einem Objekt der Klasse Abteilung mehrere Mitarbeiter speichern zu können Objektorientierte Programmierung III 8 - 22 Olaf Herden 06/2008 Felder von Objekten (I) • • Mit Mitarbeiter[] mit wird ein Feld von Objekten angelegt Hierbei sind zwei Aufrufe des new-Operators notwendig: (1) (2) (3) (4) (5) • Mitarbeiter[] mit = new Mitarbeiter[10]; ... for(int i=0; i<=9; i++){ mit[i] = new Mitarbeiter(); } Beim ersten new-Aufruf wird auf dem Heap Platz in der Größe des Feldes reserviert: mit TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 23 Olaf Herden 06/2008 Felder von Objekten (II) • Mit den Aufrufen des new-Operators in der Schleife wird jeweils Platz in der Größe eines Mitarbeiter-Objektes reserviert: mit TIAI1004: Programmierung Berufsakademie Stuttgart/Horb ... Objektorientierte Programmierung III 8 - 24 Olaf Herden 06/2008 Aggregationen und Kompositionen • • • • Neben der Assoziation sind zwei weitere Beziehungstypen bekannt Aggregation: Beziehung, die etwas zusammenfassendes darstellt („hat ein“) Komposition: Zusammenfassende Beziehung mit Existenzabhängigkeit UML-Notation: Aggregationen: Rechnung Auto „Auto hat einen Motor“ „Auto hat 3 bis 5 Räder“ <Attributbereich> <Attributbereich> <Methodenbereich> <Methodenbereich> 1 3 ... 5 Motor Rad <Attributbereich> <Attributbereich> <Methodenbereich> <Methodenbereich> TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Kompostion: „Rechnung hat eine bis beliebig viele Positionen“ Existenzabhängigkeit: Position kann nicht ohne zugehörige Rechnung existieren 1 ... * Position <Attributbereich> <Methodenbereich> Objektorientierte Programmierung III 8 - 25 Olaf Herden 06/2008 Übersicht • Operatoren this/super/instanceof • Parameterübergabe • Beziehungen zwischen Klassen • Schnittstellen • Polymorphie • Kopieren von Objekten • Klassenbibliotheken TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 26 Olaf Herden 06/2008 Schnittstellen • • • • Bisher: Abstrakte Klassen, Methoden konnten implementiert sein oder nicht (abstrakte Methoden) Idee konsequent fortsetzen: Alle Methoden ohne konkrete Definition (vollständig abstrakte Klasse) Diese werden als Schnittstellen (Interfaces) bezeichnet UML-Notation: <<interface>> Name des Interface <Attributbereich> <Methodenbereich> • • Java-Syntax: [public] interface NameDesInterface{ ... } Methodendeklaration in Schnittstellen: [public abstract] <Rückgabetyp> nameDerMethode(<Par.liste>); • Wichtig (Unterschied zu abstrakten Methoden in Klassen): - Schlüsselwort abstract muss nicht angegeben werden, kann aber Methode darf nicht protected oder private sein Leerer Rumpf wird einfach weggelassen (kein „{}“) Zeile muss mit Semikolon abgeschlossen werden TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 27 Olaf Herden 06/2008 Attribute in Schnittstellen • Attributdeklaration in Schnittstellen: <Datentyp> nameDesAttribut; • Anmerkungen: - Auch ohne Angabe von Modifiern wird jedes Attribut einer Schnittstelle automatisch als public static final deklariert - Da nur diese Kombination sinnvoll ist, sollte sie auch immer angegeben werden - Diese Attribute definieren Konstanten, die allen Klassen zur Verfügung stehen, die die Schnittstelle implementieren - Finale Attribute müssen in der Schnittstelle, in der sie deklariert werden, auch initialisiert werden, d.h. z. B. public static final int i=0; TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 28 Olaf Herden 06/2008 Schnittstellen erben Schnittstellen • • Schnittstellen können (analog zu Klassen) von anderen Schnittstellen erben und diese erweitern UML-Notation: <<interface>> <<interface>> B A • <Attributbereich> <Attributbereich> <Methodenbereich> <Methodenbereich> Java-Notation: (1) public interface A{ (2) public static final int i = 0; (3) public abstract void f(); (4) } (1) public interface B extends A{ (2) public static final int j = 0; (3) public void g(); (4) } TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 29 Olaf Herden 06/2008 Klassen implementieren Schnittstellen (I) • • • • • Schnittstellen können nicht von Klassen erben K1 Klassen können von einer mehreren Schnittstellen „erben“ <Attributbereich> Dies wird als Implementieren bezeichnet <Methodenbereich> Dabei müssen die Methoden implementiert werden Verboten UML-Notation: K2 <Attributbereich> <Methodenbereich> <<interface>> A <<interface>> B <Attributbereich> <Attributbereich> <Methodenbereich> <Methodenbereich> K3 K3 erbt von Klasse K2 und implementiert Schnittstellen A und B TIAI1004: Programmierung Berufsakademie Stuttgart/Horb <Attributbereich> <Methodenbereich> Objektorientierte Programmierung III 8 - 30 Olaf Herden 06/2008 Klassen implementieren Schnittstellen (II) • Java-Notation: (1) public class K3 extends K2 implements A,B { (2) ... (3) } Hier darf nur eine Klasse stehen • Hier können beliebig viele Schnittstellen stehen Anmerkungen: - Bei Implementierung einer Schnittstelle müssen Methoden als public deklariert werden - Implementiert Klasse nicht alle Methoden einer Schnittstelle, muss sie als abstract deklariert werden • Gründe für Einführung von Interfaces in Java: - Interfaces existieren orthogonal zur Klassenhierarchie, d.h. jede Klasse kann sie implementieren, unabhängig von ihrer Position in Klassenhierarchie TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 31 Olaf Herden 06/2008 Bsp.: Interfaces orthogonal zu Klassen Fahrzeug <<interface>> Bremsbar ... ... ... ... Landfahrzeug <<interface>> Steuerbar Wasserfahrzeug Luftfahrzeug ... ... ... ... ... ... ... ... Auto <<interface>> Fahrbar Ballon Flugzeug ... ... ... ... ... ... ... ... Kombi <<interface>> … ... ... ... ... Paket fahrzeuge TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 32 Olaf Herden 06/2008 Mehrfachimplementierung (I) • Folgendes Szenario: <<interface>> I1 <Attributbereich> boolean isCorrect() K <Attributbereich> <<interface>> I2 <Methodenbereich> <Attributbereich> boolean isCorrect() • Beide Interfaces schreiben Klasse K Implementierung der Methode isCorrect vor, was kein Problem darstellt • Bei Mehrfachvererbung wäre dies anders: Oberklassen könnten unterschiedliche Implementierung vorgeben TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 33 Olaf Herden 06/2008 Mehrfachimplementierung (II) • Folgendes Szenario: <<interface>> I2 <<interface>> I1 int RED = 1 int GREEN = 2 int BLUE = 3 … int BLACK = 10 int PURPLE = 11 … <<interface>> I3 <<interface>> I4 int WHITE = 30 … int BLACK = 20 int PURPLE = 11 int WHITE = 21 K … <Attributbereich> • Frage: Wie kann Klasse K auf welche Konstanten zugreifen? TIAI1004: Programmierung Berufsakademie Stuttgart/Horb <Methodenbereich> Objektorientierte Programmierung III 8 - 34 Olaf Herden 06/2008 Mehrfachimplementierung (III) • Folgende Regeln: - Schnittstellen vererben über mehrere Ebenen (z.B. RED wird von I1 an I2 an I4 an K vererbt) - Schnittstellen können von mehreren Schnittstellen gleiche Konstante erben (z.B. erbt I4 die Konstante RED von I2 und I3) - Konstanten dürfen überschrieben werden (z.B. I4 überschreibt den Wert von WHITE) - Schnittstellen können von mehreren Schnittstellen Konstanten erben (z.B. erbt I4 die Konstanten BLACK und PURPLE aus I2 und I3): - Zugriff in diesem Fall über voll qualifizierten Namen: I2.BLACK bzw. I3.BLACK - Auch wenn beide Konstanten gleichen Wert haben (hier PURPLE) Zugriff nur über I2.PURPLE bzw. I3.PURPLE möglich (Grund: Sicherheit bzgl. späterer Änderungen) • Beispiel TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 35 Olaf Herden 06/2008 Schnittstellen vs. abstrakte Klassen (I) Schnittstelle Abstrakte Klasse Idee (Gemeinsamkeit) Unterklassen bzw. implementierenden Klassen Methoden vorschreiben, die diese implementieren müssen Idee (Unterschied) Angabe ausschließlich von Konstanten und Methoden ohne jegliche Implementierung Angabe von Attributen, Konstanten und Methoden; dabei kann ein gewisses Verhalten schon implementiert sein Mehrfachvererbung/implementierung Möglich Nicht möglich Schlüsselwort abstract Nicht nötig, kann aber Angabe notwendig TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 36 Olaf Herden 06/2008 Schnittstellen vs. abstrakte Klassen (II) Schnittstelle Abstrakte Klasse Deklaration von Attributen und Methoden Nur als public static final gekennzeichnete Konstanten und als public abstract gekennzeichnete Methoden Erlaubt, was in Klassen erlaubt ist Methodenrumpf Muss leer sein Kann Implementierung enthalten Darstellung leerer Rumpf Wird weggelassen {} muss angegeben werden Verwendung auch in Unterklasse Ja Ja Organisation In Paketen, beide haben Zugriffsmodifier TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 37 Olaf Herden 06/2008 Schnittstelle oder abstrakte Klasse? (I) • • • Grundsätzlich: Sind alle Methoden ohne Implementierung und sollen nur Konstanten weitergegeben werden, so ist Schnittstelle zu wählen, sonst abstrakte Klasse Entscheidung aber nicht immer einfach Bsp.: Realisierung eines Timers (1) abstract class Timer{ (2) abstract long getTimeInMillis(){}; (3) } (1) interface Timer{ (2) long getTimeInMillis(); (3) } • • Beide Lösungen zunächst scheinbar gleichwertig Bei späterer Erweiterung um Methode getTimeInSeconds() ist abstrakte Klasse jedoch einfacher zu erweitern TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 38 Olaf Herden 06/2008 Schnittstelle oder abstrakte Klasse? (II) (1) public abstract class Timer{ (2) abstract long getTimeInMillis(){}; (3) (4) long getTimeInSeconds(){ (5) return getTimeInMillis()*1000; (6) } (1) public interface Timer{ (2) long getTimeInMillis(); (3) } • • In Interface wäre dies nicht möglich Anm.: In Java-Klassenbibliothek gibt es abstrakte Klassen und dazu korrespondierende Interfaces TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 39 Olaf Herden 06/2008 Beispiel: Interface Comparable<T> (I) <<interface>> Comparable<T> int compareTo(T o) • • • • java.lang Definiert totale Ordnung auf Objekten implementierender Klasse Wird als natürliche Ordnung der Klasse bezeichnet, compareTo als natürliche Vergleichsmethode Methode compareTo liefert negativen Wert, 0 bzw. positiven Wert, wenn Objekt kleiner, gleich oder größer dem Vergleichsobjekt ist Folgende Implementierungsvereinbarungen: - Sei sgn die mathematische Signum(Vorzeichen)-Funktion, d.h. ⎧ − 1, falls ex pr < 0 ⎪ sgn (ex pr ) = ⎨ 0, falls ex pr = 0 ⎪ + 1, falls ex pr > 0 ⎩ TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 40 Olaf Herden 06/2008 Beispiel: Interface Comparable<T> (II) - … - Entwickler muss sicherstellen: - Symmetrie: Für alle x,y muss sgn(x.compareTo(y)) == sgn(y.compareTo(x)) gelten - Transitivität: Für alle x,y,z muss gelten: (x.compareTo(y)) > 0 && (y.compareTo(z)) > 0) => x.compareTo(z) > 0 - Gleichheit: x.compareTo(y) == 0 => sgn(x.compareTo(z)) == sgn(y.compareTo(z)) für alle z • Beziehung zur Methode equals: - Def.: Konsistenz mit Methode equals g.d.w. für alle e1 und e2 gilt (e1.compareTo((Object) e2) == 0) hat den gleichen Booleschen Wert wie e1.equals((Object) e2) - Wird dies nicht erfüllt ist unbedingt folgender Kommantar hinzuzufügen: „This class has a natural ordering that is inconsistent with equals.“ • Beispiel TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 41 Olaf Herden 06/2008 Beispiel: Interface Serializable <<interface>> Serializable java.io • • • • • Ermöglicht das Schreiben in Ausgabestrom bzw. Lesen aus Eingabestrom von Objekten (Siehe Abschnitt „Ein-/Ausgabe“) Interface besitzt keine Konstanten und Methoden Wird als Markierungsschnittstelle (Marker interface) bezeichnet Implementierende Klasse muss Konstante serialVersionUID vom Typ long definieren, die beim Ein-/Auslesen überprüft wird Beispiel TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 42 Olaf Herden 06/2008 Übersicht • Operatoren this/super/instanceof • Parameterübergabe • Beziehungen zwischen Klassen • Schnittstellen • Polymorphie • Kopieren von Objekten • Klassenbibliotheken TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 43 Olaf Herden 06/2008 Polymorphie • Idee: - Alle Objekte einer Oberklasse (z.B. Mitarbeiter) sollen in der gleichen Art und Weise behandelt werden • Polymorphie: - Objektvariable einer Oberklasse kann auch auf Objekte der Unterklassen verweisen - Wird in diesem Falle eine Methode aufgerufen, dann wird nicht die der Oberklasse verwendet, sondern diejenige der Unterklasse (überschriebene Methode) - Entsprechende Methode wird erst zur Laufzeit ermittelt (Dynamisches Binden) TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 44 Olaf Herden 06/2008 Beispiel (I) • Gegeben sei die folgende Klassenhierarchie: GraphObject <Attributbereich> draw() Rechteck Ellipse <Attributbereich> <Attributbereich> draw() draw() Kreis <Attributbereich> draw() TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 45 Olaf Herden 06/2008 Beispiel (II) • Bei der Implementierung wird jede draw()-Methode durch die Ausgabe des Objekttypen realisiert, z.B. (1) public void draw(){ (2) System.out.println("Ellipse"); (3) } • Im Hauptprogramm können nun die draw()-Methoden „ganz normal“ aufgerufen werden, z.B. ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) (10) // Anlegen der Objekte GraphObject meinGraphObject = new GraphObject(); Ellipse meineEllipse = new Ellipse(); Rechteck meinRechteck = new Rechteck(); Kreis meinKreis = new Kreis(); // Ausgeben der Objekte meinGraphObject.draw(); meineEllipse.draw(); meinRechteck.draw(); meinKreis.draw(); TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 46 Olaf Herden 06/2008 Beispiel (III) • Führt zur Ausgabe GraphObject Ellipse Rechteck Kreis TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 47 Olaf Herden 06/2008 Beispiel (IV) • Bei Realisierung unter Nutzung von Polymorphie werden die Objekte genauso angelegt, dann in einem Feld von GraphicObjects gespeichert und der Methodenaufruf einheitlich ausgeführt: ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) (10) (11) (12) (13) (14) (15) // Anlegen der Objekte GraphObject meinGraphObject = new GraphObject(); Ellipse meineEllipse = new Ellipse(); Rechteck meinRechteck = new Rechteck(); Kreis meinKreis = new Kreis(); // Initialisieren eines Feldes von Grafik-Objekten GraphObject[] meinGraphObjectFeld; meinGraphObjectFeld = new GraphObject[4]; // Zuweisen der Objekte meinGraphObjectFeld[0] = meinGraphObjectFeld[1] = meinGraphObjectFeld[2] = meinGraphObjectFeld[3] = ... TIAI1004: Programmierung Berufsakademie Stuttgart/Horb meinGraphObject; meineEllipse; meinRechteck; meinKreis; Objektorientierte Programmierung III 8 - 48 Olaf Herden 06/2008 Beispiel (V) (16) (17) (18) (19) ... // Aufruf der draw-Methode for (int i=0; i<=3; i++){ meinGraphObjectFeld[i].draw(); } führt ebenfalls zur Ausgabe GraphObject Ellipse Rechteck Kreis TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 49 Olaf Herden 06/2008 Beispiel (VI) • • Polymorphie kann auch auf Konstruktoren angewendet werden Damit ist folgendes möglich: ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) (10) (11) (12) // Feld von Grafikobjekten GraphObject[] meinGraphObjectFeld; meinGraphObjectFeld = new GraphObject[4]; // Polymorphe Kontruktorenaufrufe meinGraphObjectFeld[0] = new GraphObject(); meinGraphObjectFeld[1] = new Ellipse(); meinGraphObjectFeld[2] = new Rechteck(); meinGraphObjectFeld[3] = new Kreis(); // Ausgabe for (int i=0; i<=3; i++){ meinGraphObjectFeld[i].draw(); } führt ebenfalls zur bekannten Ausgabe TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 50 Olaf Herden 06/2008 Übersicht • Operatoren this/super/instanceof • Parameterübergabe • Beziehungen zwischen Klassen • Schnittstellen • Polymorphie • Kopieren von Objekten • Klassenbibliotheken TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 51 Olaf Herden 06/2008 Kopieren von Objekten (I) • W.D.H.: - Durch Anwendung des Zuweisungsoperators auf Objekte wird nur eine Referenz gesetzt, aber nicht das Objekt kopiert • • Manchmal aber auch „richtige“ Kopie notwendig Zwei Möglichkeiten zum Erstellen einer identischen Kopie eines Objektes: - Eigene Methode schreiben, von Hand neues Objekt anlegen, alle Attribute kopieren und Referenz auf dieses Objekt zurückgeben - Von der Klasse Object geerbte Methode Object clone() benutzen • Beim Kopieren in objektorientierten Sprachen unterscheidet man: - Flache Kopie: Unterobjekte werden nicht mitkopiert - Tiefe Kopie: Unterobjekte werden mitkopiert • Anm.: Methode clone() erzeugt eine flache Kopie TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 52 Olaf Herden 06/2008 Kopieren von Objekten (II) • Beispiel: Objekt a (mit Unterobjekt) vorhanden b = a Kopiere a nach c flach Kopiere a nach d tief d c b a TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 53 Olaf Herden 06/2008 Methode clone() der Klasse Object (I) • • Beispiel: Manager mit Objekttyp Fahrzeug Java-Code: ( 1) public class Manager{ ( 2) ... ( 3) private String name; ( 4) private int persNr; ( 5) private String wohnort; ( 6) private Fahrzeug fahrzeug; ( 7) ... ( 8) public setKennzeichen(String s){ ( 9) this.fahrzeug.setKennzeichen(s); (10) } (11) } ( ( ( ( ( 1) public class Fahrzeug{ 2) ... 3) String fahrzeug; 4) ... 5) } TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 54 Olaf Herden 06/2008 Methode clone() der Klasse Object (II) • Vorgehen: - Methode clone() überschreiben - Methode der Oberklasse muss aufgerufen werden - Schnittstelle Cloneable muss implementiert werden • Erweiterung der Klasse Manager: ( 1) public class Manager implements Cloneable{ ( 2) ... ( 3) public Object clone(){ ( 4) try{ ( 5) return super.clone(); ( 6) } ( 7) catch (CloneNotSupportedException e){ ( 8) „Ausnahmebehandlung“ ( 9) } (10) } (11) } TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 55 Olaf Herden 06/2008 Methode clone() der Klasse Object (III) • Beispiel: ( 1) public class Anwendung{ ( 2) ... ( 3) public static void main(String[] args){ ( 4) // Anlegen eines Managers ( 5) Manager a = ( 6) new Manager("Meier",4711,"Stuttgart",12); ( 7) a.setKennzeichen("S-ZZ 99"); ( 8) // Kopieren mittels der Methode clone ( 9) Manager b = new Manager(); (10) b = (Manager) a.clone(); (11) // Ausgeben der beiden Objekte (12) a.drucken(); (13) b.drucken(); (14) // Ändern des Names und Kennzeichens bei Manager a (15) a.setName("Müller"); (16) a.setKennzeichen("S-XX 11"); (17) // Erneute Ausgabe der beiden Objekte (18) a.drucken(); (19) b.drucken(); (20) } (21) } TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 56 Olaf Herden 06/2008 Methode clone() der Klasse Object (IV) • Führt zur Ausgabe: Personalnummer: Name: Ort: Kennzeichen : 4711 Meier Stuttgart S-ZZ 99 Personalnummer: Name: Ort: Kennzeichen : 4711 Meier Stuttgart S-ZZ 99 Personalnummer: Name: Ort: Kennzeichen : 4711 Müller Stuttgart S-XX 11 Personalnummer: Name: Ort: Kennzeichen : 4711 Meier Stuttgart S-XX 11 TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 57 Olaf Herden 06/2008 Übersicht • Operatoren this/super/instanceof • Parameterübergabe • Beziehungen zwischen Klassen • Schnittstellen • Polymorphie • Kopieren von Objekten • Klassenbibliotheken TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 58 Olaf Herden 06/2008 Klassenbibliotheken (I) • • • Jede Programmiersprache besteht nicht nur aus ihren elementaren Anweisungen (z.B. Kontrollstrukturen, Möglichkeit der Klassenbildung in objektorientierten Sprachen usw.) Ergänzt werden diese um Klassenbibliotheken: Sammlungen von häufig benötigten Funktionalitäten (z.B. mathematische Funktionen, Dateibehandlung, Grafik, Gestaltung GUI, etc.) Spezifikation durch API (Application Programming Interface): - Beschreibung aller öffentlichen Klassen, Methoden und Schnittstellen der Bibliothek - Private Elemente werden hier nicht dokumentiert TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 59 Olaf Herden 06/2008 Klassenbibliotheken (II) • Verschiedene Ansätze: - Funktionen sind integraler Bestandteil der Sprache - Sprachkern mit elementaren Funktionen, dazu Funktionen von (verschiedenen) Herstellern/Entwicklern - In Java/C++: Mischung, d.h. Sprachkern mit elementaren Funktionen, zusätzliche Funktionen genormt (Java-Klassenbibliothek bzw. STL (Standard Template Library) in C++) • Einbindung: - Statisch: Bibliotheken sind Bestandteil des Programms - Dynamisch: Bibliotheken werden separat gehalten, können so von mehreren Programmen genutzt werden TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 60 Olaf Herden 06/2008 Java-Klassenbibliothek • Sehr umfangreich, z.B. in Java 1.4: - • Ca. 2700 Klassen und Schnittstellen Ca. 4800 Attribute Ca. 3700 statische Variablen Ca. 21300 Objektmethoden Ca. 2500 statische Methoden Ca. 3500 Konstruktoren Diese kann man nicht alle „auf Vorrat“ lernen, daher: - Kurzer Überblick über wichtige Pakete - Bei Bedarf in Dokumentation nachschauen TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 61 Olaf Herden 06/2008 Übersicht Java-Pakete (I) • java.applet: - Stellt Klassen für Java-Applets bereit, damit diese auf Web-Seiten ausgeführt werden können • java.awt und java.awt.*: - Das Paket AWT (Abstract Windowing Toolkit) und seine diversen Unterklassen bieten Klassen zur Grafikausgabe und Nutzung von grafischen Bedienoberflächen • java.beans und java.beans.beancontext: - JavaBeans sind wiederverwendbare Komponenten auf der Client-Seite, die beim Programmieren visuell konfiguriert werden können - Zusammenarbeit mehrerer Beans wird mit Klassen aus java.beans.beancontext realisiert • java.io: - Möglichkeiten zur Ein- und Ausgabe - Ein- bzw. Ausgabemedien (z.B. Dateien) werden als als Objekte repräsentiert - Datenströme erlauben sequenziellen Zugriff auf die Dateiinhalte TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 62 Olaf Herden 06/2008 Übersicht Java-Pakete (II) • java.lang: - DAS Standard-Paket, wird automatisch geladen und beinhaltet elementare Klassen wie String-, Thread- oder Wrapper-Klassen • java.lang.ref: - Arbeiten mit dem Garbage-Collector - Spezielle Varianten von Objekt-Referenzen, die vom Garbage-Collector besonders behandelt werden • java.lang.reflect: - Ermöglicht Reflection, d.h. Informationen über Klassen und Objekte zu ermitteln • java.math: - Mathematische Funktionen - Beliebig lange Ganzzahlen oder Fließkommazahlen • java.net und javax.net.ssl: - Kommunikation über Netzwerke - Klassen zum Aufbau von Client- und Serversystemen, die über TCP/IP miteinander kommunizieren - Sockets und SSL-Verschlüsselung TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 63 Olaf Herden 06/2008 Übersicht Java-Pakete (III) • java.nio: - Neuere Implementierung des io-Paketes • java.rmi und java.rmi.*: - Aufruf von Methoden auf entfernten Rechnern • java.security und java.security.*: - Klassen und Schnittstellen für Sicherheit (Authentifizierung und Autorisierung) - U.a. Verwaltung von Zertifikaten, Verschlüsselung (u.a. RSA-Algorithmus) und digitaler Signatur • java.sql: - Zugriff auf Datenbanken über SQL • java.text: - Entwicklung internationalisierter Programme - Behandlung von Text, Formatierung von Datumswerten und Zahlen • java.util und java.util.*: - Container, Zufallszahlen, Archivformate (JAR, ZIP), Protokollieren von Daten und Programmabläufen, Verwaltung von Benutzer- und Systemeigenschaften über Konfigurationsdateien, Unterstützung regulärer Ausdrücke TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 64 Olaf Herden 06/2008 Übersicht Java-Pakete (IV) • javax.accessibility: - Schnittstellen zwischen Eingabegeräten und Benutzerkomponenten • javax.crypto und javax.crypto.*: - Klassen und Schnittstellen für kryptografische Operationen (u.a. DiffieHellman-Schlüssel, Klassen und Schnittstellen für Schlüsselverwaltung) • javax.imageio und javax.imageio.*: - Lesen und Schreiben von Bilddateien in diversen Formaten (z.B. JPG) • javax.naming und javax.naming.*: - Zugriff auf Namensdienste (LDAPv3) • javax.net und javax.net.ssl: - Sockets und SSL-Verschlüsselung • javax.print und javax.print.*: - Drucken und Druckoptionen • javax.rmi und javax.rmi.CORBA: - Nutzen von RMI über das CORBA-Protokoll RMI-IIOP TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 65 Olaf Herden 06/2008 Übersicht Java-Pakete (V) • javax.security.*: - Authentifizierung und Autorisierung • javax.sound.*: - Verarbeitung von Audio-Dateien (MIDI) • javax.sql: - Zugriff aus Java auf Datenbanken • javax.swing: - Graphische Benutzeroberflächen • javax.transaction und javax.transaction.xa: - (Verteiltes) Transaktionsmanagement • javax.xml.* und org.xml.*: - Verarbeitung von XML-Dateien TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 66 Olaf Herden 06/2008 Zusammenfassung (I) • Operatoren this/super/instanceof: - this: Zeigt auf das aktuelle Objekt - super: Zeigt auf die Oberklasse - instanceof: Gibt Klassenzugehörigkeit an • Parameterübergabe: - Call by Value - Call by Reference • Beziehungen zwischen Klassen: - Assoziationen - Aggregationen und Kompositionen • Schnittstellen: - Vollständig abstrakte Klassen - Zur Klassenhierarchie orthogonale Eigenschaften TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 67 Olaf Herden 06/2008 Zusammenfassung (II) • Polymorphie: - Definition - Beispiele • Kopieren von Objekten: - Kopie und Referenz - Tiefe und flache Kopie - Methode clone() • Klassenbibliotheken: - Einleitung - Java-Klassenbibliothek TIAI1004: Programmierung Berufsakademie Stuttgart/Horb Objektorientierte Programmierung III 8 - 68 Olaf Herden 06/2008