10. Pakete Grundlagen zu Paketen 10. Pakete 10. Pakete Benutzung von Paketen Nutzung von Klassen aus Paketen (1) Ein Paket (package) bündelt thematisch zusammengehörige Klassen und Schnittstellen zu einer Klassenbibliothek. Für die Nutzung von Klassen aus Paketen gibt es zwei Möglichkeiten: • volle Qualifikation: Paket und Klassenname werden angegeben: Beispiele: java.awt.Point p = new java.awt.Point(); • • • • java.lang: Standardklassen zur Sprache Java • Deklaration mit Hilfe von import: Es wird einmal angegeben, aus welchen Paketen Klassen importiert werden: java.net: Klassen zur Netzwerkprogrammierung java.io: Klassen für die Ein- und Ausgabe von Daten import java.awt.Point; java.awt: Klassen für graphische Oberflächen (Abstract Window Toolkit) Point p = new Point(); Pakete haben einen Namen, den Paketnamen. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 10. Pakete 236 Grundlagen zu Paketen Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 10. Pakete Vorteile von Paketen 238 Benutzung von Paketen Nutzung von Klassen aus Paketen (2) • Pakete bilden eigene Bereiche für die Sichtbarkeit. Dadurch kann mit Paketen eine Datenkapselung erreicht werden. • Jedes Paket bildet einen eigenen Namensraum. Damit können Namenskonflikte vermieden werden und identische Namen für Klassen in verschiedenen Paketen vergeben werden. • Pakete sind gröbere Einheiten für die Strukturierung von objektorientierten Systemen als Klassen. Um nicht alle Klassen eines Paketes einzeln angeben zu müssen, besteht die Möglichkeit, mit Hilfe des * alle Klassen zu importieren. Die Anweisung import java.awt.*; importiert alle Klassen aus dem Paket java.awt. ☞ import steht zwischen einer optionalen package-Deklaration und dem Rest des Quelltextes. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 237 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 239 10. Pakete Benutzung von Paketen 10. Pakete Nutzung von Klassen aus Paketen (3) Pakete selber bauen Die package-Deklaration • Das Paket java.lang wird immer automatisch importiert. • Mit Hilfe einer package-Deklaration können wir Quelltextteile Paketen zuordnen. package Paketbezeichner; • Sollten Klassen mit gleichem Namen aus verschiedenen Paketen importiert werden, muss eine volle Qualifikation erfolgen. • Auch Pakete können hierarchisch strukturiert werden (Unterpakete). • import bezieht die Unterpakete nicht automatisch mit ein! • Die package-Deklaration muss vor allen anderen Anweisungen im Quelltext stehen. • Hinter package wird ein hierarchisch aufgebauter Paketbezeichner als Paketname angegeben. package de.fhbrs.inf.meinPaket; import java.awt.*; import java.awt.geom.*; • Wirkung: Alle Klassen und Schnittstellendefinitionen der Übersetzungseinheit (.java-Datei), werden dem Paket de.fhbrs.inf.meinPaket zugeordnet. • Natürlich können auch andere .java-Dateien diesem Paket zugeordnet werden. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 10. Pakete 240 Benutzung von Paketen Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 10. Pakete 242 Pakete selber bauen Paketnamen Statischer Import Klassenmethoden bzw. Konstanten werden über den Methodennamen (bzw. Konstantennamen) in Verbindung mit dem Klassennamen angesprochen. double x = Math.sin( Math.PI/4 ); Seit Java 5 können Klassenmethoden und Konstanten statisch importiert werden: • • • • Für die weltweite Eindeutigkeit: häufig umgedrehte Domainnamen Für die hierarchische Strukturierung ist der Punkt erlaubt. Dagegen ist leider kein “–” in Paketnamen erlaubt. Die Paketnamen java, javax und sun sind reserviert. import static java.lang.Math.sin; import static java.lang.Math.PI; double x = sin( PI/4 ); Auch beim statischen Import ist der Einsatz von * möglich. Ein statischer Import ist auch für überladene Klassenmethoden möglich. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 241 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 243 10. Pakete Pakete selber bauen 10. Pakete Default-Package Pakete selber bauen C LASSPATH Was passiert, wenn wir keine package-Deklaration angeben? • Die Quelltextteile werden einem sogenannten Default-Package zugeordnet. • Zu diesem Default-Package gehören alle Übersetzungseinheiten des lokalen Verzeichnisses, die nicht einem Paket zugeordnet sind. • Daher müssen wir uns bei kleinen Anwendungen nicht um die Paketorganisation kümmern. • Wenn sich nicht alle class-Dateien im lokalen Verzeichnis befinden, muss die virtuelle Maschine wissen, wo sie nach class-Dateien suchen soll. • Hierzu dient die Umgebungsvariable CLASSPATH. • Genauer: Im C LASSPATH werden die Verzeichnisse aufgelistet, in denen nach Paketen gesucht wird. • Mit CLASSPATH=/projekte/projekt1/classes werden die Klassen paket1.klasse1, paket1.klasse2 und auch paket1.sub1.klasse3 gefunden. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 244 10. Pakete Pakete selber bauen Verzeichnisstruktur für Pakete Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 10. Pakete 246 Pakete selber bauen jar-Dateien projekte • In der Regel setzen wir für die Entwicklung die Paketstruktur eins zu eins auf eine Dateistruktur um. • Verzeichnisse tragen den Paketnamen. • Die zum Paket gehörigen Klassen werden in den entsprechenden Verzeichnissen abgelegt. lib paket1 sub1 Klasse1 projekt1 projekt2 classes doc • Für die Auslieferung einer Klassenbiblothek ist es einfacher, wenn sich die gesamte Bibliothek in einer Datei befindet, statt in einer losen Sammlung von classDateien. • Dies ist mit jar-Dateien möglich. • Eine jar-Datei ist eine Zusammenstellung von Dateien in einer einzigen Datei. • Erzeugung von jar-Dateien: siehe Hinweise auf der Homepage. • jar-Dateien können im C LASSPATH verwendet werden. • $ cd /projekte/projekt1/classes $ jar cf ../lib/projekt1.jar paket1 paket2 $ CLASSPATH=/projekte/projekt1/lib/projekt1.jar Damit werden die Klassen aus den Paketen paket1, paket2 und paket1.sub1 gefunden. paket2 Klasse2 sub2 Klasse3 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 245 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 247 10. Pakete Zugriffsmodifikatoren und Zugriffsrechte Verwendung von Zugriffsmodifikatoren • Zur Regelung der Zugriffsrechte gibt es in Java die Modifikatoren public, protected und private. • Ohne Zugriffsmodifikator besteht das Zugriffsrecht default. • Beachten Sie: default ist kein Schlüsselwort. • Für Klassen sind die Zugriffsrechte public und default möglich. • Für Klassen- bzw. Instanzvariablen und -methoden sind möglich: default, public, protected und private. • Variablen und Methoden innerhalb von Schnittstellen sind implizit public. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 10. Pakete 248 Zugriffsmodifikatoren und Zugriffsrechte Zugriffsrechte für Variablen und Methoden Klasse A Klasse B gleiches Paket Subklasse C gleiches Paket Klasse D anderes Paket Subklasse E anderes Paket private default protected public ja ja ja ja nein ja ja ja nein ja ja ja nein nein nein ja nein nein ja/nein ja Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 249