Java Programmierung mit Gliederung von Java Software > Gliederung von Software Import ,Packages und JAR Mark Egloff 2006 1 Java Programmierung mit Lernziel Heute Abend > Sie lernen wie man Java Software gliedert und in welche Einheiten man sie einteilen kann > Sie verstehen die Bedeutung des Begriffes „Package“. > Sie können eigene Packages und Java Libraries gestalten, erstellen und einsetzen Mark Egloff 2006 2 Java Programmierung mit Gliederung von Java Software Programmeinheiten > Eine moderne Programmiersprache soll das Design eines Programms unterstützen. Hierzu ist es erforderlich, ein Programm in Einheiten zu unterteilen, um das Programm übersichtlich zu gestalten Mark Egloff 2006 3 Java Programmierung mit Gliederung von Java Software Programmeinheiten in Java > Klassen Eine Klasse definiert einen neuen Typ und beschreibt die Eigenschaften der Objekte und gibt somit den Bauplan an > Packages Ein Paket ist eine Gruppe von thematisch zusammengehörigen Klassen und Schnittstellen > Java Archives (JAR) Ein Java Archive ist eine komprimierte Bibliothek oder auch Klassenlibrary genannt. Sie besteht aus mehreren Packages und Klassen sowie zusätzlichen Konfigurationsangaben Mark Egloff 2006 4 Java Programmierung mit Gliederung von Java Software Softwarepakete (Packages) > Packages dienen dazu, die Software eines Projektes in grössere inhaltliche zusammengehörige Bereiche einzuteilen > Packages stellen die gröbsten Strukturierungseinheiten der objektorientierten Technik dar, Packages werden im Rahmen des Entwurfs der Software konzipiert > Ein Package ist in Java eine Gruppierung von Klassen und Schnittstellen. Ein Package kann auch weitere Sub-Packages enthalten Mark Egloff 2006 5 Java Programmierung mit Gliederung von Java Software Packages nutzen (1/5) > Das Java Standard API (1.5) besteht heute aus ca. 160 Packages und ca. 3300 Klassen > Ein Package kann wie ein Verzeichnisbaum angesehen werden, jede Einheit wird mit “.“ unterteilt z.B. „java.io“ oder „java.awt.color“ > Um Klassen innerhalb von Packages nutzen zu können, müssen sie dem Compiler zuerst bekannt gemacht werden > Standardmässig kennt der Compiler nur die Klassen aus dem Package „java.lang“ z.B. java.lang.System System Mark Egloff 2006 6 Java Programmierung mit Gliederung von Java Software Packages nutzen (2/5) > Um die Klasse bekannt zum machen gibt es in Java 2 Möglichkeiten > Den vollständigen Namen der Klasse inklusive des Packages angeben z.B. java.awt.Point p = new java.awt.Point(); > Mittels einer „import“ Anweisung, welche vor der ersten Klassendeklaration angegeben werden muss. z.B. import java.awt.Point; Mark Egloff 2006 7 Java Programmierung mit Gliederung von Java Software Packages nutzen (3/5) z.B. nutzen der Klasse „BufferedReader“ mit Import: import java.io.BufferedReader; class Run { public static void main( String[] args ) { BufferedReader reader = new BufferedReader (...); } } Mark Egloff 2006 8 Java Programmierung mit Gliederung von Java Software Packages nutzen (4/5) z.B. nutzen der Klasse „BufferedReader“ ohne Import: class Run { public static void main( String[] args ) { java.io.BufferedReader reader = new java.io.BufferedReader(...); } } Mark Egloff 2006 9 Java Programmierung mit Gliederung von Java Software Packages nutzen (5/5) > Damit nicht alle Klassen eines Pakets einzeln aufgeführt werden müssen, lassen sich bei „import“ mit dem Wildcard „*“ gleich alle Klassen des jeweiligen Packages bekanntmachen. > Sub-Packages werden hierbei aber nicht berücksichtigt z.B.: Import ohne „*“ import java.io.BufferedReader; import java.io.IOException; z.B.: Import mit „*“ import java.io.*; Mark Egloff 2006 10 Java Programmierung mit Gliederung von Java Software Klassen mit gleichen Namen in unterschiedlichen Paketen > Ein Problem gibt es bei mehreren gleich benannten Klassen in unterschiedlichen Packages. Hier ist eine volle Qualifizierung nötig (Klassennamen inklusive Packageangabe) z.B.: Es gibt im Package „java.awt“ und „java.util“ jeweils eine Klasse „List“ vollständige Qualifizierung import java.awt.*; import java.util.*; ... List l = new List(); Compilerfehler java.awt.List l1 = new java.awt.List(); java.util.List l2 = new java.util.ArrayList(); Mark Egloff 2006 11 Java Programmierung mit Gliederung von Java Software Der Statische Import (seit Java 1.5) > Es gibt nun seit Java 1.5 mit dem statischen Import die Möglichkeit statische Eigenschaften von Klassen direkt zu nutzen. Hierbei muss der Klassennamen nicht mehr angegeben werden z.B.: Herkömmlicher Aufruf einer statischen Funktion int m = Math.max(a,b); z.B.: mittels „import static“, keine Klassenangabe beim Aufruf import static java.lang.Math.*; ... int m = max(a,b); Mark Egloff 2006 12 Java Programmierung mit Gliederung von Java Software Eigene Packages schnüren (1/3) > Klassen, die zu einem Package gehören, befinden sich „normalerweise“ alle im gleichen Verzeichnis. > Der Name des Packages ist dann gleich dem Namen des vollständigen Verzeichnispfades. Unterteilungen mit „.“ > Kleinbuchstaben haben sich eingebürgert, Umlaute oder andere Spezialzeichen sollten vermieden werden z.B.: Beispiel Verzeichnishierarchie und Package-Namen suessigkeiten/schokolade/Toblerone.java package suessigkeiten.schokolade; Mark Egloff 2006 13 Java Programmierung mit Gliederung von Java Software Eigene Packages schnüren (2/3) > Damit eine Klasse einem Package angehört, muss sie sich in diesem Verzeichnis befinden und eine Packagdeklaration besitzen > Die Packagedeklaration erfolgt mit dem Schlüsselwort „package“ gefolgt vom vollständigen Packagenamen. Dies muss die erste Zeile in der Datei sein. z.B.: Klasse mit Packagezugehörigkeitsdeklaration package suessigkeiten.schokolade; import java.io.*; public class Toblerone { ... } Mark Egloff 2006 14 Java Programmierung mit Gliederung von Java Software Eigene Packages schnüren (3/3) > Das Package bzw. seine Klassen werden nun ganz normal kompiliert. z.B.: Kompilierung eines Packages >javac -d bin src\suessigkeiten\schokolade\*.java Mark Egloff 2006 15 Java Programmierung mit Gliederung von Java Software Eigene Packages verwenden (1/2) > Das so erstellte Package kann nun in anderen Java Applikationen eingesetzt werden > Hierzu muss es in den CLASSPATH aufgenommen werden z.B.: Kompiliertes Package in CLASSPATH aufnehmen javac –cp d:\mypackages Weihnachtsmann.java Mark Egloff 2006 16 Java Programmierung mit Gliederung von Java Software Eigene Packages verwenden (2/2) > Um Klassen außerhalb des eigenen Packages nutzen zu können, müssen diese nun wieder bekannt gemacht werden z.B.: Bekanntmachung mittels „import“ Anweisung import suessigkeiten.schokolade.Toblerone; class Weihnachtsmann { Toblerone myTobli; } Mark Egloff 2006 17 Java Programmierung mit Gliederung von Java Software Die Packagenamen java, javax und sun > Sun hat für sich selbst einige Packagenamen reserviert, die von eigenen Klassen nicht genutzt werden sollen. So liegt z.B. „java.awt.Point“ in einem Sun-Paket, und das ist leicht durch den Teil „java“ zu erkennen Sinnvolle Packagenamen > Prinzipiell kann ein Packagename beliebig sein. Die Namen bestehen in der Regel aus dem umgedrehten Domänennamen. z.B.Aus der Domäne „mycompany.ch“ wird also „ch.mycompany“ Diese Namensgebung gewährleistet, dass Klassen auch weltweit eindeutig bleiben Mark Egloff 2006 18 Java Programmierung mit Gliederung von Java Software Zugriffsberechtigung bei Klassen (1/2) > In Java kann ein Zugriffsmodifizierer „public“ bei der Klassendeklaration angegeben werden > Es kann ausserhalb des Packages nur auf „public“ Klassen zugegriffen werden. Fehlt das „public“ endet es in einem Compilerfehler > Es darf pro Datei nur eine „public“ Klasse angegeben werden z.B.: Klasse mit „public“ Modifizierer public class Toblerone { ... } Mark Egloff 2006 19 Java Programmierung mit Gliederung von Java Software Zugriffsberechtigung bei Klassen (2/2) public kein Modifizierer Package A Package A public ClassA ClassA benützt benützt AppClass1 AppClass2 AppClass1 Mark Egloff 2006 AppClass2 compilerfehler 20 Java Programmierung mit Gliederung von Java Software Eine eigene JAR Datei erstellen (1/4) > Eine Java Archive (oder auch JAR genannt), ist eine komprimierte Datei die Packages und Klassen sowie weitere Konfigurationsangaben (z.B. Versionierung) enthält > JAR Dateien können direkt in den CLASSPATH aufgenommen werden. Sie werden dabei als eine Verzeichnisstruktur angesehen. Dieses Prinzip vereinfacht es Klassen in anderen Applikationen wieder zu verwenden z.B.: CLASSPATH mit JAR Dateien javac -cp lib\xalan.jar;lib\xercesImpl.jar; lib\xmlParserAPIs.jar;. MyXMLApp.java Mark Egloff 2006 21 Java Programmierung mit Gliederung von Java Software Eine eigene JAR Datei erstellen (2/4) > Eine eigene JAR Datei kann sehr einfach mittels einem ZIP Tool erstellt werden. > Hierzu muss einfach der Folder, in dem die Packages liegen als Zip komprimiert und dann in „*.jar“ unbenannt werden z.B.: Eigene JAR Datei mit ZIP Tool erstellt Mark Egloff 2006 22 Java Programmierung mit Gliederung von Java Software Eine eigene JAR Datei nutzen > Die so erstellte JAR Datei kann nun in anderen Java Applikationen eingesetzt werden > Hierzu muss sie in den CLASSPATH aufgenommen werden z.B.: JAR Datei in CLASSPATH aufnehmen javac –cp lib\mypackages.jar Weihnachtsmann.java Mark Egloff 2006 23 Java Programmierung mit Gliederung von Java Software Konfigurationen im JAR > Eine JAR Datei kann zusätzliche Angaben enthalten. > Zusätzliche CLASSPATH Angaben > Versionsangaben > Signierung und Verschlüsselung > Eigene Konfigurations-Parameter > Diese Konfigurationen werden innerhalb des JAR‘s in ein „METAINF“ Verzeichnis abgelegt > Die Versionierung ist besonders wichtig, da Java Klassen selbst keine Versionierungsmöglichkeiten besitzen http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html Mark Egloff 2006 24 Java Programmierung mit Gliederung von Java Software Konfigurationen im JAR – Beispiel Versionsangabe Manifest-Version: 1.0 Main-Class: org.apache.xalan.xslt.Process Created-By: 1.2.2 (Sun Microsystems Inc.) Class-Path: xercesImpl.jar xml-apis.jar Name: org/apache/xml Implementation-Vendor: Apache Software Foundation Implementation-URL: http://xml.apache.org/xalan-j/dist/ Implementation-Version: 2.4.0 Implementation-Title: org.apache.xml Comment: DTM implementation and utilities Mark Egloff 2006 25 Java Programmierung mit Gliederung von Java Software Eine Verzeichnisstruktur für eigene Projekte > Neben der Einteilung des eigenen Programms in Packages ist es auch sinnvoll, die gesamte Applikation über verschiedene Verzeichnisse aufzubauen. > Im Allgemeinen finden sich drei wichtige Hauptverzeichnisse: > „src“ für die Quelldateien, > „lib“ für externe Bibliotheken > und „bin“ (oder „build“) für die erzeugen Dateien http://java.sun.com/blueprints/code/projectconventions.html Mark Egloff 2006 26 Java Programmierung mit Objektorientierte Programmierung (OOP) > Kapselung, Information Hiding Mark Egloff 2006 27 Java Programmierung mit Lernziel Heute Abend > Sie kennen die verschiedenen Zugriffsarten auf die Klasseneigenschaften > Sie verstehen Begriffe wie „Kapselung“, „Information Hiding“ und „Java Bean“. > Sie können eigene Schnittstellen und ihre Zugriffsberechtigung in Klassen einbauen Mark Egloff 2006 28 Java Programmierung mit Kapselung und Information Hiding Was bedeutet „Kapselung“ und „Information Hiding“? > Ein Ziel Objektorientierter Programmierung ist es die Repräsentation der Daten und Implementation zu „verbergen“. Es soll kein „Unbefugter“ die zentralen Daten der Objekte verändern können > „Information Hiding“ bedeutet, dass wir bestimmte Teile der Klasse verstecken, bzw. bestimmte Attribute und Methoden der Klasse so schützen, dass diese niemand direkt anwenden kann > Mittels „Kapselung“ sind wir gezwungen Objekte über die dafür vorgesehen Schnittstellen anzusprechen und zu verwenden > „Kapselung“ bzw. „Information Hiding“ ist kein Schutz, dass jemand den Code der Klasse verändert Mark Egloff 2006 29 Java Programmierung mit Kapselung und Information Hiding Warum „Kapselung“ und „Information Hiding“ ? > Minimierung des Risikos Direkter Zugriff auf die zentralen Daten ist immer fehleranfällig und bietet ein gewisses Risiko. > Minimierung von Fehlern und Missbrauch Der Programmierer erstellt eine Programmsequenz nur für bestimmte Fälle. Werden diese Programmsequenzen für andere Fälle verwendet, entstehen Fehler. Mittels Kapselung können solche Fälle bzw. Missbräuche verhindert werden > Bessere Austauschbarkeit garantieren Verbergung der Implementation garantiert, dass Schnittstellen für den Datenaustausch eingehalten werden, dadurch wird eine höhere Austauschbarkeit der Softwareteile erreicht Mark Egloff 2006 30 Java Programmierung mit Kapselung und Information Hiding Warum „Kapselung“ und „Information Hiding“ ? > Der Kreis eines Radius ist immer positiv. Was passiert nun falls dieser irrtümlicherweise negativ gesetzt wird? Können wir dann den weiteren Verlauf des Programms gewährleisten? Wo ist die Ursache und wie beheben wir das Problem? z.B.: negativer Radius bei Klasse Kreis Kreis k = new Kreis(); k.radius = -3.5f; System.out.println( k.berechneUmfang() ); negativ Das Problem liegt beim direkten Datenzugriff Mark Egloff 2006 31 Java Programmierung mit Kapselung und Information Hiding Das Prinzip der Kapselung > Methoden bilden die Schnittstellen eines Objektes bzw. einer Klasse nach aussen. Mit ihnen lassen sich die Zugriffe auf das Innere des Objektes steuern > Wir schützen den direkten Zugriff auf die Attribute und erlauben Veränderungen nur noch über Objektmethoden x Schnitt stelle Objekt Attribut Kein direkter Zugriff mehr möglich Zugriff nur noch über Schnittstelle Mark Egloff 2006 32 Java Programmierung mit Kapselung und Information Hiding Das Prinzip der Kapselung – die 4 Zugriffsmodifizierer > Java bietet hierzu die Möglichkeit bei der Deklarierung der Attribute und Methoden anzugeben, ob und wie diese von aussen zugreifbar sind Nur in der eigenen Klasse In allen Klassen des eigenen Packages private (kein Modifizierer) In allen abgeleiten Klassen und zudem in allen Klassen des eigenen Packages In allen Packages bzw. überall protected public Mark Egloff 2006 33 Java Programmierung mit Kapselung und Information Hiding Das Prinzip der Kapselung – Beispiel (1/3) > 1.Schritt: Wir schützen das Attribut „radius“, indem wir es als „private“ deklarieren. Somit wird kein direkter Zugriff von aussen mehr gestattet z.B.: privates Attribut „radius“ der Klasse Kreis class Kreis { private float radius; } z.B.: Zugriff ausserhalb der Klasse endet in Compilerfehler Kreis k = new Kreis(); k.radius = -3.5f; Compilerfehler Mark Egloff 2006 34 Java Programmierung mit Kapselung und Information Hiding Das Prinzip der Kapselung - Beispiel (2/3) > 2.Schritt: Wir implementieren eine Objektmethode „setRadius()“, welche das private Attribut initialisiert. Diese Methode überwacht die Zuweisung und löst, falls nötig, eine Exception aus. z.B.: public Objektmethode welche den Radius setzt class Kreis { private float radius; public void setRadius( float r ) { if (radius < 0) throw new IllegalArgumentException("stop"); else this.radius = r; }} Mark Egloff 2006 35 Java Programmierung mit Kapselung und Information Hiding Das Prinzip der Kapselung - Beispiel (3/3) > 3.Schritt (Optional): Wir müssen zusätzlich noch eine Objektmethode „getRadius()“ schreiben, welche das private Attribut wieder ausliest. z.B.: public Objektmethode welche den Radius liest class Kreis { private float radius; public void setRadius( float r ) { ... } public float getRadius() { return this.radius; } } Mark Egloff 2006 36 Java Programmierung mit Kapselung und Information Hiding Die „JavaBeanTM“ > Kapselung ist in Java weit verbreitet. Klassen, welche nur für die Datenmodellierung verwendet werden, besitzen für das jeweilige Attribut nur „getXxx()“ und setXxx()“ Methoden > Solche Klassen werden in Java als „JavaBean“ (Kaffeebohnen) bezeichnet. SUN hat diesen Begriff als Markenzeichnen eintragen lassen. Es ist zu einem Standard geworden. class Person { public void setFirstName( String s ) { ... } public String getFirstName() { ... } public void setLastName( String s ) { ... } public String getLastName() { ... } } http://java.sun.com/products/javabeans/index.jsp Mark Egloff 2006 37 Java Programmierung mit Objektorientierte Programmierung (OOP) > Verrerbung bei Objekten Mark Egloff 2006 38 Java Programmierung mit Lernziel Heute Abend > Sie lernen ein weiteres Merkmal der Objektorientierter Programmierung, die Vererbung bei Objekten > Sie kennen die Vor- und Nachteile der Vererbung und was in Java möglich ist > Sie erstellen eigene Vererbungen von Objekten in Java Mark Egloff 2006 39 Java Programmierung mit Vererbung bei Objekten Was bedeutet „Vererbung“? > Neben der „besitzt“ oder „use“ Beziehungen von Objekten gibt es in der Objektorientierung eine weitere, wichtige Möglichkeit zur Wiederverwendung: die Vererbung. > Sie basiert auf der Idee, dass Eltern ihren Kindern Eigenschaften mitgeben. In OO erbt eine Klasse die Eigenschaften (Attribute und Methoden) einer anderen Klasse > Vererbung wird oft auch als „Generalization“ bezeichnet. Man redet auch von „Inheritance“ oder im Deutschen von „ableiten“ , „Spezialisierung“ oder „Konkretisierung“ Mark Egloff 2006 40 Java Programmierung mit Vererbung bei Objekten Vorteile von Vererbung > „Wiederverwendung“ Durch Vererbung wird bestehender Code in anderen Klassen „eingebettet“ ohne dass er kopiert oder verändert werden muss möglich, aber in der Regel ist es ein falscher Ansatz, Mythos > Erhöhung der Austauschbarkeit Vererbung bindet die Klassen noch dichter aneinander. Mittels dieser engen Verbindung können wir später sehen, dass Klassen in gewisser Weise austauschbar sind siehe auch „Interfaces“ oder „Polymorphie“ Mark Egloff 2006 41 Java Programmierung mit Vererbung bei Objekten Beispiel einer Vererbung - Fahrzeuge > Das Strassenverkehrsamt benötigt eine Software zur Verwaltung der Fahrzeuge. Jede Fahrzeugart hat seine spezifischen Eigenschaften, dennoch sind einige Eigenschaften bei allen gleich z.B. Identifikationsnummer Mark Egloff 2006 42 Java Programmierung mit Vererbung bei Objekten Beispiel einer Vererbung - Fahrzeuge > Lösungsansatz: Die gemeinsamen Eigenschaften werden in eine Basisklasse „Fahrzeug“ bzw. „Auto“ untergebracht. Alle anderen Klassen erben dann diese Fahrzeug Basisklasse Auto Fahrrad Motorrad PW Lastwagen Bus Mark Egloff 2006 43 Java Programmierung mit Vererbung bei Objekten Beispiel einer Vererbung - Figuren > Problem einer Zeichnungsapplikation: Alle Objekte haben unterschiedliche Attribute. Ein paar Eigenschaften besitzen jedoch alle Figuren z.B. Position, Farbe ist bei allen gleich Kreis Dreieck Quadrat radius mittelPunkt farbe punktA, punktB, punktC mittelPunkt farbe seite mittelPunkt farbe draw() draw() draw() Mark Egloff 2006 44 Java Programmierung mit Vererbung bei Objekten Beispiel einer Vererbung - Figuren > Lösung: Alle gemeinsamen Eigenschaften werden in eine Basisklasse „Figur“ ausgelagert. Die anderen Klassen erben dann diese Figur Kreis mittelPunkt farbe radius draw() Dreieck punktA, punktB, punktC draw() Quadrat seite draw() Mark Egloff 2006 45 Java Programmierung mit Vererbung bei Objekten Mehrfachvererbung > Mehrfachvererbung scheint auf den ersten Blick elegant, jedoch hat es in der Vergangenheit zu vielen Problemen geführt > Erbt man dieselbe Eigenschaft von zwei verschiedenen Klassen kann dies logisch nicht mehr aufgelöst werden. „Routenproblem“ Auto Fahrzeug Fahrrad motor Wasserfahrzeug motor PW Panzer Amphibienfahrzeug Mark Egloff 2006 Welcher motor ?? 46 Java Programmierung mit Vererbung bei Objekten Vererbung in Java > In Java wird mittels dem Schlüsselwort „extends“ bei der Klassendeklaration angegeben von welcher Klasse man erben möchte > Java kennt nur einfache Vererbung, Mehrfachvererbung wird nicht unterstützt Syntax: class ClassName extends BaseClassName z.B.: class Kreis extends Figur { private float radius; public setRadius(float r) {...} } Mark Egloff 2006 47 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Beispiel Figur Figur mittelPunkt farbe Kreis class Run radius { public static void main(String[] args) { Kreis k = new Kreis(); k.setMittelPunkt( new Punkt(10,20) ); k.setFarbe( new Color(0,0,255) ); } } Kreis erbt alle Eigenschaften von Figur, diese können ausserhalb oder innerhalb der Klasse verwendet werden Mark Egloff 2006 48 Java Programmierung mit Vererbung bei Objekten Figur Vererbung in Java – Beispiel Figur class Kreis extends Figur { private float radius; mittelPunkt farbe Kreis radius public Kreis() { radius = 1.0f; mittelPunkt = new Punkt(0,0); } ... } Kreis erbt alle Eigenschaften von Figur, diese können ausserhalb oder innerhalb der Klasse verwendet werden Mark Egloff 2006 49 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Die Referenz „super“ > Mittels der Referenz „super“ wird innerhalb der Klasse auf die vererbten Eigenschaften der Basisklasse zugegriffen > „super“ ist, ebenfalls wie „this“, eine Referenz auf sich selber, zeigt aber nur auf die vererbten Eigenschaften z.B.: Verwendung von „super“ innerhalb der Klasse class Kreis extends Figur { ... public Kreis() { radius = 1.0f; super.mittelPunkt = new Punkt(0,0); }} Mark Egloff 2006 50 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Die Sichtbarkeit der Members (1/2) > Mittels den Zugriffsmodifizierer kann man in der Basisklasse genau festlegen welche Eigenschaften in den zu vererbenden Klassen zur Verfügung stehen oder nicht Zugriff in Basisklasse Bedeutung in abgeleiteter Klasse private Wird zwar vererbt aber die neue Klasse kann nicht darauf zugreifen [nichts] Wird zwar vererbt aber die neue Klasse kann nur darauf zugreifen wenn Sie im gleichen Package ist protected Wird vererbt kann aber nur innerhalb der neuen Klasse angesprochen werden public Wird vererbt, kann innerhalb und ausserhalb der neuen Klasse verwendet werden Mark Egloff 2006 51 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Die Sichtbarkeit der Members (2/2) protected Package A kein Modifizierer Package A ClassA ClassA protected int x int x ClassAA classAA classB ClassB protected int y int y ClassBB ClassBB Mark Egloff 2006 52 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Konstruktoren verketten (1/4) > Konstruktoren werden zwar vererbt, jedoch sind diese nicht direkt aufrufbar wie die anderen vererbten Eigenschaften > Vererbte Konstruktoren können nur in den Konstruktoren der neuen Klasse aufgerufen werden. Der Aufruf erfolgt über die Methode „super()“ welche als 1. Zeile im neuen Konstruktor erfolgen muss > Besitzt die Basisklasse eigene Konstruktoren, so muss die neue Klasse ebenfalls diese entsprechend neu Implementieren und die Konstruktoren der Basisklasse aufrufen Verkettung Mark Egloff 2006 53 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Konstruktoren verketten (2/4) class Figur { private Punkt mittelPunkt; public Figur( Punkt p ) { mittelPunkt = p; } } class Kreis extends Figur { compilerfehler } Sobald die Basisklasse ein Konstruktor hat, muss dieser in der neuen Klasse genutzt werden, sonst Compilerfehler Mark Egloff 2006 54 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Konstruktoren verketten (3/4) class Kreis extends Figur { private float radius; public Kreis( Punkt p, float r ) { Aufruf Konstruktor Basisklasse super( p ); radius = r; } } Der Aufruf von „super()“ muss als1. Zeile erfolgen Mark Egloff 2006 55 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Konstruktoren verketten (4/4) z.B.: Ablauf der Instanzierung bei der Vererbung Kreis myKreis = 2. new Kreis(new Punkt(47,11),3.0f); 1. Figur(new Punkt(47,11)) Kreis(new Punkt(47,11),3.0f) Mark Egloff 2006 56 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Destruktor verketten (1/2) > Ähnlich wie bei Konstruktoren muss auch die „finalize()“ Methode bei der Vererbung verkettet werden, sofern man eine eigene „finalize()“ Methode schreiben möchte > Der Aufruf der überschriebenen „finalize()“ Methode der Basisklasse erfolgt mit „super.finalize()“ Der Compiler überwacht nicht dass diese Regel eingehalten wird !!! Wer das „super.finalize()“ vergisst, riskiert dass die Ressourcenbereiningung nicht korrekt abläuft ! Mark Egloff 2006 57 Java Programmierung mit Vererbung bei Objekten Vererbung in Java – Destruktor verketten (2/2) z.B.: Aufruf der überschriebenen „finalize()“ Methode class Kreis extends Figur { protected void finalize() { System.out.print("Hilfe, ich werde gelöscht!"); super.finalize(); } } Mark Egloff 2006 58 Java Programmierung mit Vererbung bei Objekten Nachteile der Vererbung > Statische Beziehung Die Vererbung ist statisch, kann zur Laufzeit nicht mehr geändert werden z.B. bei Softwareupdates ein Problem > Effizienz Allgemein gehaltene Methoden in Superklassen sind oft langsamer und weniger effizient als für den Einzelfall „massgeschneiderte“ Methoden. > Komplexität Unendlich verzweigte und in die Tiefe gehende Klassen- und Interface-Hierarchien sind schwer zu durchschauen und machen den Programmcode wenig transparent Mark Egloff 2006 59