Kap. 11 Pakete

Werbung
# 79
Kap. 11
Pakete
Kap. 11.1
"Programmierung im Großen"
Kap. 11.2
Pakete als Entwurfseinheiten
Kap. 11.3
Erstellung von Paketen
Kap. 11.4
Benutzung von Paketen
Kap. 11.5
Paketnamen
Kap. 11.6
Gültigkeitsbereich von Klassennamen
Kap. 11.7
Zugriffsmodifikatoren
# 80
Kap. 11.1
"Programmierung im Großen"
Programmeinheiten in Java sind
•
•
•
•
Klassen
Schnittstellen (Interfaces)
Threads (Nebenläufigkeiten)
Pakete
Ein Paket stellt eine Klassenbibliothek dar, die einen Namen trägt. Ein
Paket kann Klassen, Threads, Schnittstellen und Unterpakete als Komponenten enthalten.
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 40 -
# 81
Vorteile von Paketen:
•
Sie bilden einen eigenen Bereich für den Zugriffsschutz (Information Hiding).
•
Jedes Paket bildet einen eigenen Namensraum zur Vermeidung
von Namenskonflikten.
•
Pakete sind größere Einheiten für die Strukturierung von objektorientierten Systemen als die Klassen.
Kap. 11.2
Pakete als Entwurfseinheiten
Paket A
Pakete stellen die gröbsten
Strukturierungseinheiten der OOP dar.
Paket B
Paket C
Die Abbildung veranschaulicht das Schichtenmodell für Pakete. Paket
A „benutzt“ die Pakete B und C.
# 82
Kap. 11.3
Erstellung von Paketen
Alle Dateien des Pakets werden mit der Deklaration des Paketnamens versehen:
// Datei: Artikel.java
package lagerverwaltung; // Deklaration Paketname
class Artikel {
// Paket-Komponente Artikel
private String name;
private float preis;
Artikel (String name, float preis) {
this.name
= name;
this.preis
= preis;
}
......
}
Vor package sind nur Kommentare erlaubt! Nur eine Paketdeklaration pro Datei ist erlaubt! Paketnamen werden klein geschrieben!
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 41 -
# 83
Enthält eine Datei eine public Klasse, so muß der Dateiname gleich
sein wie der Name dieser Klasse. Nur eine Klasse pro Datei darf public
sein!
Soll eine Klasse von einem anderen Paket nutzbar sein, so muß sie
public sein! Andernfalls ist sie nur innerhalb ihres Pakets nutzbar (als
Service-/Hilfs-Klasse)!
// Datei: Lager.java // hat keine public Klassen!
package lagerverwaltung;
class Artikel { ....}
class Kunde {
private String kundenname;
private int kundennummer;
Kunde (String name, int nummer) {
kundenname
= name;
kundennummer = nummer;
}
....}
# 84
Ein Paket kann wiederum Pakete enthalten:
Z. B.:
Das Paket betriebsverwaltung enthält die Pakete
lagerverwaltung,
kundenverwaltung,
lieferantenverwaltung.
Die Paketdeklaration des Pakets lagerverwaltung sieht dann wie
folgt aus:
package betriebsverwaltung.lagerverwaltung;
Und die Paketdeklaration des Pakets kundenverwaltung sieht wie
folgt aus:
package betriebsverwaltung.kundenverwaltung;
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 42 -
# 85
Kap. 11.4
Benutzung von Paketen
Klassen eines Pakets werden mit dem Punktoperator angesprochen:
// Datei: Kreiseck.java
package kreiseckpaket;
public class Kreiseck {
eckpaket.Eck eckRef = new eckpaket.Eck();
kreispaket.Kreis kreisRef =
new kreispaket.Kreis();
}
Die Klasse Kreiseck des Pakets kreiseckpaket verwendet die
Klasse Eck aus dem Paket eckpaket und die Klasse Kreis aus
dem Paket kreispaket.
# 86
Die Import-Vereinbarung:
Die import-Vereinbarung muss hinter der package-Deklaration, aber
vor dem Rest des Programms im Quelltext stehen!
// Datei: Kreiseck.java
package kreiseckpaket;
import kreispaket.*;
import eckpaket.*;
public class Kreiseck {
Eck eckRef
= new Eck();
Kreis kreisRef = new Kreis();
}
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 43 -
# 87
Mit
import kreispaket.*;
werden alle public-Klassen des Pakets importiert.
import kreispaket.Kreis;
importiert nur die Klasse Kreis.
import betriebsverwaltung.lagerverwaltung.*;
importiert alle Klassen, die sich im Unterpaket lagerverwaltung
befinden.
import java.lang;
aus der Java-API wird automatisch in jede Quelldatei importiert!
# 88
Kap. 11.5
Paketnamen
Zusammenhang zwischen Paketnamen und Verzeichnisstruktur
Alle class-Dateien, die zu einem Paket gehören, müssen in einem
Verzeichnis liegen, dessen Name identisch mit dem Paketnamen ist.
Zum Zugriff auf ein Paket muß der ganze Verzeichnis-Pfad bekannt
sein. Dazu dient der CLASSPATH. Er enthält den Pfad eines Verzeichnisses wie z. B.
C:\
C:\projekte\projekt1\classes
projekte
projekt2
projekt1
src
classes
doc
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 44 -
# 89
Wird CLASSPATH auf
C:\projekte\projekt1\classes
gesetzt, so wird nach Klassen in den
Paketen unterhalb dieses Verzeichnisses
gesucht. Z.B.
java paket1.Klasse1
C:\
projekte
projekt2
projekt1
src
classes
paket1
sub1
src
paket2
12345678901234567
12345678901234567
12345678901234567
12345678901234567
Klasse1
12345678901234567
12345678901234567
12345678901234567
12345678901234567
Klasse2
12345678901234567
12345678901234567
sub2
12345678901234567
12345678901234567
12345678901234567
12345678901234567
Klasse3
12345678901234567
# 90
Eine Klasse Klasse1 innerhalb eines Paketes paket1 kann kompiliert werden durch den Aufruf:
javac paket1\Klasse1.java
Klasse1 kann gestartet werden durch den Aufruf:
java paket1.Klasse1
Weiterhin ist zu beachten, dass:
•
•
•
Verzeichnisnamen den Paketnamen entsprechen
Paketnamen nur kleine Buchstaben enthalten
jedes Unterpaket ein Unterverzeichnis darstellt.
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 45 -
# 91
Der vollständige Paketname des Paketes sub1 ist paket1.sub1 .
Der Zugriff auf eine Klasse muss immer über den vollständigen Paketnamen erfolgen: Z.B. wird auf Klasse3 zugegriffen mit
paket1.sub1.Klasse3
Eindeutige Paketnamen
aus fht-esslingen.de wird der Paketname de.fht-esslingen
Anonyme Pakete
Wird kein Paketname deklariert, dann gehört die Datei zu einem anonymen oder unbenannten Paket. Alle Klassen, die sich innerhalb desselben Verzeichnisses befinden und die nicht explizit einem Paket
zugeordnet wurden, gehören dann automatisch zum gleichen anonymen Paket.
# 92
Kap. 11.6
Gültigkeitsbereich von Klassennamen
Der Gültigkeitsbereich eines Klassennames erstreckt sich auf das
ganze Paket. Ein eingeführter Klassenname gilt in allen Dateien, die
zu diesem Paket gehören!
Der Compiler geht in Java mehrfach über den Quellcode, bis er alle
Klassendeklarationen gefunden hat.
Wenn die Klasse nicht public deklariert wird, so können die Dateinamen frei gewählt werden.
// Datei: Datei1.java
package personen;
class Student {...}
class Zensur {...}
// Datei: Datei2.java
package personen;
class Schueler {...}
// verwendet Zensur
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 46 -
# 93
Kap. 11.7
Zugriffsmodifikatoren
Ohne Zugriffsmodifikatoren (private, public, protected) ist
der Zugriffsschutz default (friendly). default und friendly sind keine
Schlüsselworte.
Zugriffsschutz für Klassen und Schnittstellen
hier sind nur default (friendly) oder public erlaubt.
// Datei: Artikel.java
package lagerverwaltung;
public class Artikel {...}
class Kunde {...}
// Datei: Materialabrechnung.java
package abrechnung;
import lagerverwaltung.Artikel; // geht, da public
import lagerverwaltung.Kunde; //geht nicht, da default
public class Materialberechnung {...}
# 94
Nur dann, wenn eine Klasse public deklariert ist, ist sie auch in
anderen Paketen sichtbar und kann durch import erreicht werden!
Ist der Zugriffsschutz default, dann ist sie nur für Klassen des gleichen Paketes sichtbar. Selbst in Unterpaketen ist sie nicht sichtbar!
Zugriffsschutz für Methoden und Datenfelder
•
einer Klasse: möglich sind default, public, protected und
private.
•
einer Schnittstelle: möglich ist nur public (implizit angenommen).
protected und private ergibt Compilerfehler!
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 47 -
# 95
hat Zugriff private
auf
default
protected public
Klasse A
Ja
Ja
Ja
Ja
Klasse B
(gleiches Paket)
Nein
Ja
Ja
Ja
Sohnklasse C
(gleiches Paket)
Nein
Ja
Ja
Ja
Sohnklasse E
(anderes Paket)
Nein
Nein
Ja/Nein
Ja
Klasse D
(anderes Paket)
Nein
Nein
Nein
Ja
Zugriff auf Datenfelder und Methoden der Klasse A
# 96
Zugriffsschutz für Konstruktoren
Konstruktoren ohne public (d.h. default) können nur von Klassen
des eigenen Pakets aufgerufen werden. D.h. nur Klassen innerhalb
des Pakets können Objekte erzeugen.
Konstruktoren mit protected können von allen Klassen des Pakets
aufgerufen werden. Subklassen in anderen Paketen können keine
Objekte erzeugen, aber den Konstruktor der Vaterklasse mit
super() aufrufen.
Konstruktoren mit private können nur innerhalb der Klasse benutzt
werden. Keine andere Klasse kann Objekte erzeugen!
Konstruktoren mit public können von allen Klassen verwendet
werden. Jede Klasse kann ein Objekt erzeugen.
Der voreingestellte Default-Konstruktor hat den Zugriffsschutz der
Klasse (public oder default).
Harms: "SoftwareEntwicklung", SWENT, WS 2001/02
- 48 -
Herunterladen