Tech Archive Help

16 Java – Pakete und Imports

Mit Sicherheit sind euch am Anfang in euren Dateien oder auch hier im Tech-Archive bestimmte Zeilen wie package kesares.techarchive oder import java.util.List aufgefallen.

In Java werden Klassen in sogenannten Paketen (Packages) organisiert. Ein Package ist eine Sammlung von zusammengehörigen Klassen, Interfaces, Enums, etc. die logisch gruppiert sind. Sie helfen dabei, den Code zu strukturieren und Namenskonflikte zu vermeiden. Zudem fördern Pakete auch die Zugriffskontrolle.

16_java_packages_imports_1.png

Package-Zugriff aus anderem Package

Es gibt drei Möglichkeiten, um von außerhalb auf ein Package zuzugreifen.

  1. import package.*

  2. import package.className

  3. Angabe des vollständig qualifizierten Namens

Verwendung von import package.*

Wird import package.* verwendet, erhält die Klasse Zugriff auf sämtliche Klassen und Schnittstellen innerhalb dieses Packages, jedoch nicht auf Subpackages.

package kesares.print; public class Printer { public void printHello() { System.out.println("Hello!"); } }
package kesares.techarchive; import kesares.print.*; public class Main { public static void main(String[] args) { Printer printer = new Printer(); printer.printHello(); } }

Verwendung von import package.className

Wenn jedoch package.className importiert wird, hat die Klasse nur auf die deklarierte Klasse des Packages Zugriff.

package kesares.print; public class Printer { public void printHello() { System.out.println("Hello!"); } }
package kesares.print; public class Manager { public void printHello() { System.out.println("Hello!"); } }
package kesares.techarchive; import kesares.print.Printer; public class Main { public static void main(String[] args) { Test test = new Test(); test.printHello(); Manager manager = new Manager(); // Compile error! manager.printHello(); } }

Verwendung des vollständig qualifizierten Namens

Auch wenn der vollständige qualifizierte Name einer Klasse angegeben wird, ist nur diese deklarierte Klasse zugänglich.

Hierbei ist import nicht notwendig. Allerdings muss jedes Mal der vollständig qualifizierte Name angegeben werden, wenn auf diese Klasse zugegriffen wird.

package kesares.print; public class Printer { public void printHello() { System.out.println("Hello!"); } }
package kesares.techarchive; public class Main { public static void main(String[] args) { kesares.print.Printer printer = new kesares.print.Printer(); printer.printHello(); } }

Es wird meistens verwendet, wenn zwei Packages denselben Klassennamen haben. Die Packages java.util und java.sql enthalten z. B. jeweils eine Date-Klasse.

Subpackages

Subpackages sind Unterpakete eines Hauptpakets und dienen dazu, den Code besser zu strukturieren und organisieren. Ein Paket kann beliebig viele Subpackages enthalten und diese wiederum ebenfalls weitere Subpackages.

Im vorherigen Abschnitt Package-Zugriff aus anderem Package haben wir die Subpackages kesares.techarchive und kesares.print verwendet. Die Struktur der Subpackages folgt dabei einer hierarchischen Ordnung, die durch Punkte getrennt wird. In einem Dateisystem fungieren alle Packages wie normale Verzeichnisse oder Ordner. Das vorherige Beispiel würde auf der Festplatte dann folgendermaßen aussehen.

kesares ├───techarchive │ └───Main.java └───print └───Printer.java

Anderes Beispiel: Sun Microsystems hat ein Hauptpaket java definiert, welches zahlreiche Klassen wie System, String, Reader, Writer, Proxy, Socket und noch viele mehr enthält. Diese Klassen sind thematisch in verschiedene Gruppen kategorisiert. Reader und Writer dienen dabei als Ein- und Ausgabe von Zeichenströmen (character streams), während Socket und Proxy Klassen für die Netzwerkkommunikation bereitstellen.

Um die Verwaltung zu erleichtern, wurde das java-Package in mehrere Subpackages unterteilt, darunter java.lang, java.io und java.net. Die Klassen Reader und Writer sind dabei dem java.io-Package und die Klassen Socket und Proxy dem java.net-Package zugeordnet.

Das java.lang-Package

Das java.lang-Package ist eines der zentralen und wichtigsten Pakete in der Java-Standardbibliothek. Es wird automatisch in jedem Java-Programm importiert, sodass die darin enthaltenen Klassen ohne expliziten Import verwendet werden können.

java.lang stellt unter anderem die folgenden grundlegenden Klassen zur Verfügung, die essenziell für die Programmierung mit Java sind.

Statischer Import – import static

Die statische Importfunktion wurde in Java 5 hinzugefügt und erleichtert das häufige Arbeiten mit statischen Klassenmitgliedern (Klassenmethoden, Klassenvariablen und Konstanten).

Die Syntax ähnelt der regulären Importanweisung hinsichtlich der durch Punkte getrennten Liste von Paket- und Unterpaketnamen und es können ebenso einzelne bzw. alle statischen Mitglieder einer Klasse importiert werden.

import static java.lang.Math.PI; // imports only the static constant PI import static java.lang.Math.cos; // imports only the static method cos() import static java.lang.Math.*; // imports all static members of Math
import static java.lang.Math.PI; import static java.lang.Math.cos; public class Main { public static void main(String[] args) { double d = cos(PI); // no errors } }
Last modified: 07 October 2024