Ein Vortrag im Rahmen des Wahlpflichtmoduls „Fortgeschrittene Programmierung mit JAVA“ Themenspeicher Strukturen objektorientierter Programmierung (Wiederholung) Klassen und Vererbung Schnittstellen und Implementierung Spezialfälle und Abgrenzung Geschachtelte Klassen Arten und Kerneigenschaften Anwendungsgebiete und Beispiele Implementierung Diskussion 11/24/2011 Jesko Eggers | WS2011/2012 2 Grundstruktur, Modifizierer , Vererbung und Konsequenzen 11/24/2011 Jesko Eggers | WS2011/2012 3 Grundstruktur Vaterklasse ist implizit Quelltext: java.lang.Object Standardkonstruktur Methoden „clone()“, „equals(…)“, „getClass()“, „toString()“ und Weitere 11/24/2011 Jesko Eggers | WS2011/2012 4 Modifizierer „public“: öffentliche Sichtbarkeit „abstract“: verhindert Objekterzeugung „final“: verhindert Vererbung 11/24/2011 Jesko Eggers | WS2011/2012 5 Vererbung und Konsequenzen Schlüsselwort „extends“ Ist-ein-Beziehung Für die abgeleitete Klasse gilt… alle Variablen u. Methoden der Vaterklasse sind mit Gewissheit verfügbar (ggf. „super“) Neue Variablen und Methoden können hinzugefügt, Bestehende überschrieben werden (Ausnahme: „final“) 11/24/2011 Jesko Eggers | WS2011/2012 6 Grundstruktur, Zweck und Realisierung 11/24/2011 Jesko Eggers | WS2011/2012 7 Grundstruktur und Zweck Keine Objekterzeugung wie bei abstrakter Klasse, aber dahingegen… kein Konstruktor möglich alle Methoden implizit abstrakt „static final“-Variablen möglich Mehrfachimplementierung möglich, daher flexibler als Vererbung Einsatz... als „Gerüst“ zu Markierungszwecken Namensendung meist „…able“ 11/24/2011 Jesko Eggers | WS2011/2012 8 Realisierung Schlüsselwörter „Interface“ und „implements“ Quelltext: 11/24/2011 Jesko Eggers | WS2011/2012 9 Subschnittstellen, abstrakte Klassen und Top-Level Klassen 11/24/2011 Jesko Eggers | WS2011/2012 10 Spezialfälle Abstrakte Klassen Treten rein- und teilabstrakt auf Einsatz als „Gerüst“ um… Implementierungsaufwand einsparen Redundanz beim Quelltext zu vermeiden Subschnittstellen Schnittstellen „erben“ Schnittstellen Einsatz zur… 11/24/2011 Vermeidung von Redundanz Verbesserung der Übersicht Schnittstellen sollten nicht geändert werden! Jesko Eggers | WS2011/2012 11 Abgrenzung Die bisher vorgestellte Klassen sind immer direkt erreichbar. Sie bilden die Summe der Top-Level Klassen Alle übrigen Klassen sind innere Klassen 11/24/2011 Jesko Eggers | WS2011/2012 12 Übersicht und Eckpfeiler 11/24/2011 Jesko Eggers | WS2011/2012 13 Übersicht Typ statische innere Klasse Mitgliedsklasse Code class Out { class Out { static class In {} class In {} } } Lokale Klasse Anonyme innere Klasse class out { Out() { class In {} } } Class Out { Out() { new Runnable() { public void run() {} }; } } [Ullenboom 2012], Tab 7.1 11/24/2011 Jesko Eggers | WS2011/2012 14 Statische innere Klasse Keine „echten“ inneren Klassen (ORACLE) In kann lediglich auf statische Variablen von Out zugreifen Zugriff von außen mit Out.In; ohne Instanz von Out möglich. Beispiel fuenfzehn.java 11/24/2011 Jesko Eggers | WS2011/2012 15 Mitgliedsklasse Besitzt keine statischen Eigenschaften <Referenz auf Out>.new <Name von In> erzeugt Instanz von In Zugriff auf Out von In durch Out.this.<Eigenschaft> Warum geht das? Weil der Klassenname eindeutig ist! Beispiel sechzehn.java 11/24/2011 Jesko Eggers | WS2011/2012 16 Lokale Klasse Sind in Anweisungsblöcken von Methoden verankert Keine Sichtbarkeitsmodifizierer, Klassenmethoden und statische Variablen Beispiel siebzehn.java 11/24/2011 Jesko Eggers | WS2011/2012 17 Anonyme innere Klasse Automatische Objekterzeugung bei Klassendeklaration Objekt hat keinen Namen Kein eigener Konstruktor, Verwendung von Exemplarinitialisierungsblöcken möglich Nur finale und statische Variablen sowie Objektmethoden Keine zusätzlichen Implementierungen und Vererbungen möglich Beispiel achtzehn.java 11/24/2011 Jesko Eggers | WS2011/2012 18 Aufzählung und Event-Handler 11/24/2011 Jesko Eggers | WS2011/2012 19 Aufzählung Farben rot, grün, blau sollen gespeichert werden. 3 Implementierungen ohne geschachtelte Klassen mit geschachtelten Klassen händisch mit geschachtelten Klassen automatisch („enum“) Beispiel zwanzig.java (frei nach [Middendorf u.a. 2003] ) 11/24/2011 Jesko Eggers | WS2011/2012 20 Event-Handler Implementierung als anonyme innere Klasse nach [Middendorf u.a. 2003] Frame frame = new Frame(); frame.addWindowListener(new WindowAdapter() { public void windowIconified(WindowEvent e) { animator.stop(); } public void windowDeiconified(WindowEvent e) { animator.start(); } }); 11/24/2011 Jesko Eggers | WS2011/2012 21 Modifizierer Modifizierer erlaubt auf Äußeren Klassen Inneren Klassen Äußeren Inneren Schnittstellen Schnittstellen public protected private static final abstract [Ullenboom 2012], Tab 7.2 11/24/2011 Jesko Eggers | WS2011/2012 23 Compiler-Behandlung und deren Folgen 11/24/2011 Jesko Eggers | WS2011/2012 24 Compiler Ausführung von Bytecode ab Java 1.0 möglich (keine JRE-Änderung) Kompilierung von Quelltext ab Java 1.1 möglich (Compileranpassung) Erzeugung von Top-Level-Klassen aus den inneren Klassen nach der Namenskonvention: Out$In.class 11/24/2011 Jesko Eggers | WS2011/2012 25 Zugriffsrechte Zugriff mittels paketsichtbarer access$XXX()- Methoden Gefahr bei eingeschmuggelten Klassen Pakete sind im Java-Archiv zu schützen („Java sealing“) 11/24/2011 Jesko Eggers | WS2011/2012 26 [Ullenboom 2012] ULLENBOOM, Christian: Java ist auch eine Insel. Galileo Computing, 2012 [Middendorf u. a. 2003] MIDDENDORF, Stefan; SINGER, Reiner; HELD, Jörg: JAVA Programmierhandbuch und Referenz. dpunkt.verlag GmbH, 2003 11/24/2011 Jesko Eggers | WS2011/2012 27