# 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 -