1. Pakete

Gewöhnliche Java-Programme umfassen eine enorme Anzahl von Klassen. Wie viele? Tausende, Zehntausende. Und wenn man außerdem berücksichtigt, dass das Programm verschiedene Bibliotheken verwendet, die Klassen enthalten, die von anderen Programmierern geschrieben wurden, dann kann die Anzahl der Klassen leicht in die Millionen gehen!

Es wäre nahezu unmöglich, für all diese Millionen oder auch nur Tausende von Klassen eindeutige Namen zu finden.

Natürlich können wir uns Namen wie A123und vorstellen B345, aber wenn es darum geht, einen guten Klassennamen zu wählen, der es einfacher macht, die Klasse zu verstehen (wie Stringzum Beispiel bei Strings), dann ist es schon eine Menge, tausend eindeutige Namen zu generieren der Arbeit.

Aus diesem Grund ist es in Java üblich, Klassen mit dem Schlüsselwort package in Pakete zu gruppieren.

Java-Klassen und ihre Pakete sind den Dateien und Ordnern auf einem Computer sehr ähnlich.

Wenn Sie beispielsweise 10 Dokumente auf Ihrem Computer speichern müssen, würden Sie sie wahrscheinlich nur in einem Ordner aufbewahren. Aber was ist, wenn Sie über Tausende von Dokumenten verfügen (z. B. ein Repository mit allen Dokumenten eines Unternehmens)?

Da Tausende von Dokumenten gespeichert werden müssen, besteht eine Lösung darin, mehrere Ordnerebenen mit aussagekräftigen Namen zu erstellen. Und dann speichern Sie in einem Ordner auf der allerletzten Ebene die Dokumente, die sich auf diesen bestimmten Ordner beziehen. Auch gute aussagekräftige Namen für die Dokumente schaden nicht.

Tatsächlich machen wir das alles für Klassen in Java.

Die Dateien, die die Klassen enthalten, werden in verschiedenen Verzeichnissen (Ordnern) gespeichert, und der vollständige Name des Klassenordners mit all seinen Unterordnern ist der Name des Pakets. Beispiel:

Pfad zur Datei Paketnamen Klassenname
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Im Gegensatz zu Ordnernamen verwenden Paketnamen einen Punkt als Trennzeichen. Mit anderen Worten: Der Ordner \com\codegym\tasks\entspricht dem com.codegym.tasksPaket.


2. srcOrdner

In Java ist es üblich, alle Klassen für ein Programm in einem einzigen Ordner (und Unterordnern) zu speichern. Dieser Ordner heißt normalerweise src(kurz für „source“ ).

Dieser Ordner wird als Projektstamm (oder Quellstamm ) bezeichnet und alle Paketpfade sind relativ dazu. Beispiele:

Ordner Paketnamen
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

In dieser Situation sagen Programmierer etwas wie „Wir haben ein Projekt namens my, das sich im c:\projects\dataOrdner befindet“ oder „Wir haben ein Projekt namens project, das sich im d:\files\git\dataOrdner befindet“

Es ist am besten, Klassen immer in Paketen abzulegen und nicht direkt im Stammordner ( src. Wenn Sie nur wenige Klassen haben, stellt dies kein Problem dar. Wenn es jedoch viele Klassen gibt, kann es sehr leicht zu Verwirrung kommen. Also , erstellen Sie Ihre Klassen immer nur in Paketen.

In Java ist es üblich, Klassen und Paketen aussagekräftige Namen zu geben. Viele Unternehmen veröffentlichen ihre eigenen Bibliotheken (eine Reihe von Klassen) und integrieren, um Verwirrung zu vermeiden, den Namen des Unternehmens/der Website/des Projekts in den Namen des Pakets:

Paketnamen Firmen-/Projektname
org.apache.common
org.apache.tomcat
org.apache.util
Apache-Projekt
com.oracle.jdbc
Oracle-Unternehmen
java.io
javax.servlet
Oracle-Unternehmen, Java-Projekt
com.ibm.websphere
IBM-Unternehmen, WebSphere-Projekt
com.jboss
JBoss-Projekt

3. Dateiinhalte

Gemäß dem Java-Sprachstandard müssen Informationen über einen Klassennamen und den Namen seines Pakets in der Datei mit dem Code enthalten sein. Das allgemeine Formular ist unten dargestellt:

package package-name;

public class ClassName
{

}

Der Paketname muss mit dem Ordnernamen übereinstimmen und der Dateiname muss mit dem Namen der öffentlichen Klasse übereinstimmen.

Wenn Sie eine Datei haben, sollte diese Folgendes enthalten:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Klassen importieren

Der Klassenname und der Paketname bilden den sogenannten vollqualifizierten Namen der Klasse .

Beispiele:

Vollständig qualifizierter Name Paketnamen Klassenname
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
keiner
Cat

Die guten Nachrichten:

Der vollständig qualifizierte Klassenname ist innerhalb eines Projekts immer eindeutig. Schließlich können Sie nicht zwei Dateien mit demselben Namen in einem einzigen Ordner erstellen.

Die schlechten Nachrichten:

Vollqualifizierte Klassennamen sind normalerweise entweder lang oder sehr lang. Und jedes Mal im Code einen langen Namen (z. B. java.util.ArrayList) auszugeben, ist äußerst umständlich.

Aus diesem Grund hat Java die Möglichkeit hinzugefügt, Klassen zu importieren .

Sie können den Kurznamen einer Klasse in Ihrem Code verwenden , müssen dem Compiler jedoch zunächst mitteilen, welcher vollqualifizierte Klassenname dem Kurznamen entspricht . Was wäre, wenn Sie in Ihrem Projekt nun mehrere Klassen mit demselben Namen hätten? Oder Sie haben ursprünglich eins, aber dann kamen 15 weitere hinzu...

Um einen kurzen Klassennamen in Ihrem Code zu verwenden, müssen Sie das folgende Konstrukt hinzufügen:

import fully-qualified-class-name;

Diese Deklaration muss ganz am Anfang der Klasse direkt nach der packageDeklaration hinzugefügt werden.

Beispiel:

package com.codegym.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

Wir haben zwei Klassen ( und ) importiert , sodass wir ihre Kurznamen in unserem Code verwenden können. Und der Compiler weiß, welche Klassen er verwenden muss.java.util.Scannercom.test.helper.special.ArrayList

Und so würde derselbe Code aussehen, wenn wir ihn nicht verwendet hätten import:

package com.codegym.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

Wenn Ihr Projekt übrigens zwei Klassen mit dem Namen hat Scanner, können Sie nicht beide in dieselbe Datei importieren: Sie müssen für eine von ihnen den langen Namen verwenden.

Nehmen wir an, Sie haben eine Jen in Ihrem Team. Es gibt keine Kommunikationsprobleme, da jeder weiß, wer sie ist. Aber wenn es drei Jens gäbe, müssten vollständig qualifizierte Namen verwendet werden, um sie zu unterscheiden.

Anmerkung 1

Wenn Sie übrigens zu faul sind, Ihrer Klasse viele Importanweisungen hinzuzufügen, können Sie die Lazy-Version verwenden: Geben Sie anstelle eines bestimmten Klassennamens ein Sternchen ein:

import package-name.*;

Dadurch können Sie die Kurznamen aller Klassen im Paket verwenden.

Anmerkung 2

Alle Klassen im java.langPaket werden automatisch importiert, sodass Sie keine importAnweisung für sie schreiben müssen. Eine dieser Klassen kennen Sie bestimmt schon: java.lang.String. Ja, das ist richtig. Dies ist die StringKlasse, die wir für die Arbeit mit Strings verwendet haben.