Gliederung von Software Import ,Packages und JAR

Werbung
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
Herunterladen