4 Abstrakte Klassen,Interfaces und Packages

Werbung
4 Abstrakte Klassen,Interfaces
und Packages
Abstrakte Klassen
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Grundlage: eine Basisklasse kann keine Instanzen erzeugen
Ausgangspunkt war Vererbung – Übernahme von Attributen und
Methoden in abgeleitete Klassen
public class GeoFigur {
protected float Länge;
protected float Breite;
protected float Fläche;
static protected int InstCounter;
// Konstruktoren
// Methoden zum Setzen und Lesen
public float setl(float x) {…}
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
•diese Attribute und Methoden sind allgemeingültig,
•andere Methoden machen nur für konkrete Instanz Sinn, wie
beispielsweise:
public abstract float berechneFlaeche();
public abstract float berechneVolumen();
diese Methoden erhalten den Modifier abstract:
• abstrakte Methoden können nicht vom Typ static, private oder
final sein
• sie enthalten keine Methodendefinition
• beinhaltet eine Klasse eine abstrakte Methode, dann ist die
Klasse selbst abstrakt
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Abstrakte Klassen sind durch das Schlüsselwort „abstract“
gekennzeichnet und können nicht als final deklariert werden. Sie
können auch nicht instanziert werden.
Soll eine abstrakte Klasse verwendet werden (zum Beispiel die
Ableitungen Dreieck, Rechteck, Kreis der Klasse GeoFigur) muss
die abstrakte Methode implementiert werden.
Allen abgeleiteteten Klassen sind aber die abstrakten Methoden
gemeinsam (gleiche Parameter und Rückgabewerte).
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Interfaces
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
In manchen Fällen ist es sinnvoll, eine Klasse mit zwei oder mehr
Basisklassen zu erzeugen  Mehrfachvererbung
Beispiel Leichtathlet
Basisklasse:
Leichtathlet
Abgeleitet:
Weitspringer – Hochspringer – 100m Läufer
– Hürdenläufer ...
Neue Klasse:
Zehnkämpfer
Erbt von bestimmten Klassen, die von Leichtathlet abgeleitet sind 
Übernimmt Methoden und Attribute von 10 Klassen
Problem: sind in den Basisklassen Variablen oder Methoden mit
gleichem Namen aber unterschiedlicher Ausprägung vorhanden 
Zuordnung schwierig
Beispiel: Weitspringer
enthalten
Java
und
Hochspringer
HS Merseburg (FH) WS 06/07
könnten
springe()
4 Abstrakte Klassen,Interfaces
und Packages
Alternativen:
• es könnte eine Methode fest angesprochen werden  aber
Vorteile der Mehrfachvererbung gehen verloren
• bei jedem Aufruf die Methode explizit angeben z.B.
Weitspringer.springe()  auf dynamische Zuordnung von M.
wird verzichtet
Mehrfachvererbung wird
nutzbringend eingesetzt:
aber
nur
in
wenigen
Fällen
wirklich
Zehnkämpfer ist weder Weitspringer noch Hochspringer
Interfaces
Mit Schnittstellen überwindet Java die Einschränkungen der
Einfachvererbung ohne die Nachteile der MFV in Kauf nehmen zu
müssen
IF definieren beliebige Anz. von Methoden und Variablen und damit
gleichzeitig eigenen Referenztyp.
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Um eine Schnittstelle S zu implementieren muß eine Klasse C alle in
der Schnittstelle enthaltenen Methoden konkret realisieren 
Verpflichtung
Eine Schnittstelle kann andere Schnittstellen erweitern.
Allgemeine Form:
[public]
[abstract]
BasisInterface] {
interface
InterfaceName
[extends
[public] [static] [final] Konstante1 = Wert1;
...
[public] [abstract] Methode1(Argumentliste);
}
Jede Variable im Interface gilt automatisch als static und final  es
handelt sich um eine Konstante - die zu initialisieren ist !!!!
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
public interface Kalorien {
public double lesenKalorien();
}
Jede Klasse, die eine Methode lesenKalorien() enthält, kann das
Interface implementieren:
public class SchokoKeks extends Keks implements Kalorien {
private double kal;
public double lesenKalorien() {
return kal;
}
// .. weitere Methoden von SchokoKeks
}
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Andere Klassen können Referenzen auf Objekte der Klasse Interface
erzeugen und diesen Objekte der Klasse SchokoKeks zuweisen:
public class A {
Kalorien SKeks = new SchokoKeks();
System.out.println(Skeks.lesenKalorien());
...
}
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Nutzen von Interfaces
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Wenn andere Klassen mit anderer Vererbungshierarchie ebenfalls
das Interface imlementieren ...
public class Pausenbrot
extends Brot
implements Kalorien {
...
public double lesenKalorien() {
... implementieren
}
}
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Pausenbrot und
Schokokeks stammen
Vererbungshierarchien,
implementieren
Schnittstelle.
von unterschiedlichen
aber
die
gleiche
Klasse A kann daher über die Schnittstelle Kalorien die Methode
lesenKalorien() aller betreffender Klassen aufrufen:
public class A {
Kalorien SKeks = new SchokoKeks();
Kalorien PBrot = new Pausenbrot();
System.out.println(Skeks.lesenKalorien());
System.out.println(PBrot.lesenKalorien());
...
}
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Packages
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Bisher war jede Klasse eine eigene Datei  .class
 Ziel der Packages: Gliederung der Projektklassen und der
Systembibliotheken
Pakete enthalten inhaltlich zusammengehörende Klassen,
Schnittstellen und Unterpakete. Alle Klassen gehören implizit zu
einem Package, das unbenannt ist.
Paketdeklaration:
package ein.paket.name;
class KlassenName {...}
Der Paketname ist implizit jedem im Paket enthaltenen
Typnamen vorangestellt (vor allen Klassen und Schnittstellendefinitionen der Klasse).
Der vollständige Name für ein Package besteht aus
Komponenten, die durch Punkte getrennt sind .
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Packages
korrespondieren
mit
der
(abhängig von Java-Implementation)
Verzeichnisstruktur
• Jede Komponente eines P-Namens kann einem bestimmten
Verzeichnis des Rechners zugeordnet werden
• Klassen und Schnittstellen werden als einzelne Dateien im
Verzeichnis gespeichert
Namenswahl:
• Grundsätzlich beliebig,
• systemweite Packages  Namenskonvention von Sun 
gewährleistet weltweit eindeutige Namen für P.
• Internet Domain Namen + interner PackageName
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Beispiele:
Package
zugehörige Dateinamen:
Klasse
Methode
java.lang.Thread.start()
Package
../java/lang/Thread.class
Klassse Methode
com.ms.awt.image.getsize()
../com/ms/awt/image.class
../lib/classes.zip
Package
Klasse Methode
de.hs-merseburg.in.pax.java.GeoFig.setB()
Java
HS Merseburg (FH) WS 06/07
4 Abstrakte Klassen,Interfaces
und Packages
Zugriff:
über
den
direkten
Paketbezeichner
Namen
einschließlich
Beispiel:
Klasse A in Package x.y.z  x.y.z.A
Eindeutige Referenz möglich:
public class B {
int f() {
x.y.z.A einA;
x.y.z.A nochEinA;
...
einA = new x.y.z.A();
Java
}}
HS Merseburg (FH) WS 06/07
vorangestelltem
4 Abstrakte Klassen,Interfaces
und Packages
Problem: unübersichtlicher Quelltext  import
import x.y.z.A;
import x.y.z.B;
public class D {
int g() {
A a =
new A();
B b =
new B();
x.y.z.C c = new x.y.z.C();
...
// nicht imp. Name
}}
Import von Teilen oder des ganzen Paketes
import x.y.z.A;
import x.y.z:*;
Importiert nur die Klassen einer Ebene  Unterpakete müssen
selbst importiert werden.
Java
HS Merseburg (FH) WS 06/07
Herunterladen