Java-Paket

Um Klassen besser zu organisieren, bietet Java einen Paketmechanismus, um Namensräume für Klassennamen zu unterscheiden.

Die Rolle von Paketen

  • 1. Klassen oder Schnittstellen mit ähnlichen oder verwandten Funktionen in demselben Paket organisieren, um Klassen leicht finden und verwenden zu können.

  • 2. Wie Ordner verwenden auch Pakete eine baumförmige Verzeichnisstruktur zur Speicherung. Klassennamen innerhalb desselben Pakets sind unterschiedlich, und Klassennamen aus verschiedenen Paketen können gleich sein. Wenn Klassen mit demselben Namen aus zwei verschiedenen Paketen gleichzeitig aufgerufen werden, sollte der Paketname hinzugefügt werden, um sie zu unterscheiden. Daher können Pakete Namenskonflikte vermeiden.

  • 3. Pakete definieren auch Zugriffsberechtigungen. Nur Klassen mit Paketzugriffsberechtigung können auf Klassen in einem bestimmten Paket zugreifen.

Java verwendet den Paketmechanismus, um Namenskonflikte zu vermeiden, den Zugriff zu steuern und Suche und Lokalisierung von Klassen, Schnittstellen, Enumerationen und Annotationen zu ermöglichen.

Die Syntax der package-Anweisung lautet:

package pkg1[.pkg2[.pkg3…]];

Zum Beispiel eine Datei Something.java mit folgendem Inhalt:

package net.java.util; public class Something{ ... }

Dann sollte sein Pfad wie folgt lauten:net/java/util/Something.javaAuf diese Weise gespeichert. Das Paket wird verwendet, um verschiedene Java-Programme zu klassifizieren und zu speichern, wodurch es für andere Java-Programme bequemer wird, sie aufzurufen.

Ein Paket kann als eine Gruppe zusammenhängender Typen (Klassen, Schnittstellen, Enumerationen und Annotationen) definiert werden, die Zugriffsschutz und Namensraumverwaltung für diese Typen bietet.

Im Folgenden sind einige Pakete in Java aufgeführt:

  • java.lang- Pakete für grundlegende Klassen
  • java.io- Pakete mit Eingabe-/Ausgabefunktionalität

Entwickler können selbst eine Gruppe von Klassen und Schnittstellen zu Paketen zusammenfassen und eigene Pakete definieren. Dies ist in der tatsächlichen Entwicklung zu empfehlen. Nachdem Sie die Implementierung von Klassen abgeschlossen haben, erleichtert die Gruppierung verwandter Klassen anderen Programmierern die Erkennung, welche Klassen, Schnittstellen, Enumerationen und Annotationen zusammengehören.

Da ein Paket einen neuen Namensraum erstellt, verursacht es keine Namenskonflikte mit Namen in anderen Paketen. Die Verwendung des Paketmechanismus erleichtert die Implementierung der Zugriffskontrolle und das Auffinden verwandter Klassen.


Pakete erstellen

Beim Erstellen eines Pakets müssen Sie einen geeigneten Namen dafür auswählen. Wenn danach eine andere Quelldatei Klassen, Schnittstellen, Enumerationen oder Annotationstypen enthält, die von diesem Paket bereitgestellt werden, muss die Paketdeklaration am Anfang dieser Quelldatei stehen.

Die Paketdeklaration sollte in der ersten Zeile der Quelldatei stehen. Jede Quelldatei kann nur eine Paketdeklaration enthalten, und jeder Typ in dieser Datei unterliegt ihr.

Wenn eine Quelldatei keine Paketdeklaration verwendet, werden die Klassen, Funktionen, Enumerationen, Annotationen usw. darin in einem unbenannten Paket abgelegt.

Beispiele

Sehen wir uns ein Beispiel an. Dieses Beispiel erstellt ein Paket namens animals. Normalerweise werden Kleinbuchstaben für die Benennung verwendet, um Konflikte mit Klassen- und Schnittstellennamen zu vermeiden.

Fügen Sie dem Paket animals eine Schnittstelle hinzu:

Code der Datei Animal.java:

/*Dateiname: Animal.java*/ package animals; interface Animal { public void eat(); public void travel(); }

Fügen Sie als Nächstes die Implementierung dieser Schnittstelle im selben Paket hinzu:

MammalInt.java Dateicode:

package animals; /*Dateiname: MammalInt.java*/ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }

Kompilieren Sie dann diese beiden Dateien und platzieren Sie sie in einem Unterverzeichnis namens animals. Verwenden Sie den folgenden Befehl zum Ausführen:

$ mkdir animals
$ cp Animal.class  MammalInt.class animals
$ java animals/MammalInt
Mammal eats
Mammal travel

Das Schlüsselwort import

Um die Mitglieder eines Pakets zu verwenden, müssen wir dieses Paket explizit im Java-Programm importieren.

In Java wird das Schlüsselwortimportverwendet, um Typen zu importieren, die in anderen Klassen oder Paketen definiert sind, sodass diese Typen in der aktuellen Quelldatei verwendet werden können.

importDas Schlüsselwort wird verwendet, um Klassen, Schnittstellen oder statische Mitglieder aus anderen Paketen zu importieren. Es ermöglicht Ihnen, Klassen aus anderen Paketen direkt in Ihrem Code zu verwenden, ohne den vollständigen Paketnamen der Klasse anzugeben.

In einer Java-Quelldatei muss die import-Anweisung am Anfang der Java-Quelldatei stehen. Ihre Syntax lautet:

import package1[.package2…].(classname|*);

Die import-Anweisung wird nach der package-Anweisung platziert:

//Die erste Nicht-Kommentarzeile ist die package-Anweisung. package com.example; //Die import-Anweisung importiert Klassen aus anderen Paketen. import java.util.ArrayList; import java.util.List; //Klassendefinition public class MyClass { //Klassenmitglieder und Methoden }

Wenn eine Klasse in einem Paket eine andere Klasse im selben Paket verwenden möchte, kann der Paketname weggelassen werden.

Sie können die import-Anweisung verwenden, um eine bestimmte Klasse zu importieren:

import com.example.MyClass;

Auf diese Weise können Sie die Methoden, Variablen oder Konstanten der Klasse MyClass direkt in der aktuellen Quelldatei verwenden.

You can also use the wildcard*verwenden, um ein gesamtes Paket oder Unterpaket zu importieren:

import com.example.mypackage.*;

In this way, you can importcom.example.mypackagealle Klassen in einem Paket importieren, sodass Sie die Methoden, Variablen oder Konstanten jeder Klasse in diesem Paket in der aktuellen Quelldatei verwenden können. Beachten Sie, dass beim Verwenden des Wildcard-Zeichens*zum Importieren eines gesamten Pakets nur die Klassen im Paket importiert werden, nicht die Unterpakete des Pakets.

When importing a class or package, you need to provide the fully qualified name of the class or package. The fully qualified name includes the combination of package name and class name, with a dot.als Trennzeichen dient.

Beispiele

import java.util.ArrayList; // Importiert die ArrayList-Klasse aus dem java.util-Paket
import java.util.*; // Importiert alle Klassen aus dem java.util-Paket

import com.example.MyClass; // Importiert die Klasse MyClass aus dem Paket com.example
import com.example.*; // Importiert alle Klassen aus dem Paket com.example

Beispiel

Das folgende payroll-Paket enthält bereits die Klasse Employee. Als Nächstes fügen wir dem payroll-Paket eine Klasse Boss hinzu. Wenn die Klasse Boss auf die Klasse Employee verweist, muss sie nicht das Präfix payroll verwenden. Das Beispiel für die Klasse Boss sieht wie folgt aus.

Code der Datei Boss.java:

package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } }

Was, wenn die Klasse Boss nicht im Paket payroll ist? Die Klasse Boss muss eine der folgenden Methoden verwenden, um Klassen aus anderen Paketen zu referenzieren.

Verwenden Sie den vollqualifizierten Klassennamen, zum Beispiel:

payroll.Employee

Verwenden SieimportVerwenden Sie das Schlüsselwort zum Importieren, mit dem Platzhalter.*:

import payroll.*;

Verwenden Sieimportdas Schlüsselwort, um die Klasse Employee zu importieren:

import payroll.Employee;

Hinweis:

Eine Klassendatei kann beliebig viele Import-Deklarationen enthalten. Import-Deklarationen müssen nach der Paketdeklaration und vor der Klassendeklaration stehen.


Verzeichnisstruktur von Paketen

Das Ablegen von Klassen in Paketen hat zwei Hauptauswirkungen:

  • Der Paketname wird Teil des Klassennamens, wie bereits besprochen.
  • Der Paketname muss mit der Verzeichnisstruktur übereinstimmen, in der der entsprechende Bytecode liegt.

Hier ist eine einfache Möglichkeit, Ihre eigenen Java-Dateien zu verwalten:

Platzieren Sie den Quellcode von Typen wie Klassen und Schnittstellen in einer Textdatei. Der Name der Datei ist der Name des Typs, mit .java als Erweiterung. Zum Beispiel:

//Dateiname: Car.java package vehicle; public class Car { //Klassenimplementierung }

Als Nächstes platzieren Sie die Quelldatei in einem Verzeichnis, das dem Namen des Pakets der Klasse entspricht.

....\vehicle\Car.java

Der korrekte Klassenname und Pfad sehen nun so aus:

  • Klassenname -> vehicle.Car

  • Pfadname -> vehicle\Car.java (unter Windows-Systemen)

Üblicherweise verwendet ein Unternehmen die umgekehrte Form seines Internetdomänennamens als Paketnamen. Wenn die Internetdomäne beispielsweise example.com lautet, beginnen alle Paketnamen mit com.example. Jeder Teil des Paketnamens entspricht einem Unterverzeichnis.

Zum Beispiel gibt es eincom.example.test-Paket, das eine Quelldatei namens Example.java enthält. Dementsprechend sollte es eine Reihe von Unterverzeichnissen wie folgt geben:

....\com\example\test\Example.java

Beim Kompilieren erstellt der Compiler für jeden Typ wie eine Klasse oder Schnittstelle, der im Paket definiert ist, eine andere Ausgabedatei. Der Name der Ausgabedatei ist der Name des Typs, mit .class als Erweiterung. Zum Beispiel:

//Dateiname: Example.java package com.example.test; public class Example { } class Google { }

Nun kompilieren wir diese Datei mit der Option -d wie folgt:

$javac -d . Example.java

Dadurch werden die kompilierten Dateien wie unten gezeigt abgelegt:

.\com\example\test\Example.class
.\com\example\test\Google.class

Sie können alle \\com\\example\\test\\ Klassen, Schnittstellen usw. importieren, die definiert sind in:

import com.example.test.*;

Die kompilierten .class-Dateien sollten wie die .java-Quelldateien in Verzeichnissen abgelegt werden, die dem Paketnamen entsprechen. Es ist jedoch nicht erforderlich, dass der Pfad der .class-Datei derselbe ist wie der Pfad der entsprechenden .java-Datei. Sie können die Quell- und Klassenverzeichnisse getrennt anordnen.

<path-one>\sources\com\example\test\Example.java
<path-two>\classes\com\example\test\Google.class

Auf diese Weise können Sie Ihr Klassenverzeichnis mit anderen Programmierern teilen, ohne Ihren Quellcode preiszugeben. Wenn Sie Quellcode und Klassendateien auf diese Weise verwalten, können der Compiler und die Java Virtual Machine (JVM) alle in Ihrem Programm verwendeten Typen finden.

Der absolute Pfad des Klassenverzeichnisses heißtKlassenpfad. Er wird in der SystemvariableCLASSPATH festgelegt.Der Compiler und die Java Virtual Machine konstruieren den Pfad der .class-Dateien, indem sie den Paketnamen an den Klassenpfad anhängen.

<path- two>\\classes ist der Klassenpfad, der Paketname ist com.example.test, und der Compiler und die JVM suchen nach .class-Dateien in <path-two>\\classes\\com\\example\\test.

Ein Klassenpfad kann mehrere Pfade enthalten. Mehrere Pfade sollten durch ein Trennzeichen getrennt werden. Standardmäßig suchen der Compiler und die JVM im aktuellen Verzeichnis. JAR-Dateien enthalten Klassen im Zusammenhang mit der Java-Plattform, daher werden ihre Verzeichnisse standardmäßig in den Klassenpfad aufgenommen.


Festlegen der Systemvariable CLASSPATH

Verwenden Sie den folgenden Befehl, um die aktuelle CLASSPATH-Variable anzuzeigen:

  • Windows-Plattform (DOS-Befehlszeile): C:\> set CLASSPATH
  • UNIX-Plattform (unter Bourne-Shell): # echo $CLASSPATH
Leeren Sie den Inhalt der aktuellen CLASSPATH-Variable:
  • Windows-Plattform (DOS-Befehlszeile): C:\> set CLASSPATH=
  • UNIX-Plattform (unter Bourne-Shell): # unset CLASSPATH; export CLASSPATH

CLASSPATH-Variable festlegen:

  • Windows-Plattform (DOS-Befehlszeile): C:\> set CLASSPATH=C:\users\jack\java\classes
  • UNIX-Plattform (unter Bourne-Shell): # CLASSPATH=/home/jack/java/classes; export CLASSPATH
Weitere Erweiterungen