1. Paket

Vanliga Java-program involverar ett enormt antal klasser. Hur många? Tusentals, tiotusentals. Och om du också tar hänsyn till att programmet använder olika bibliotek som innehåller klasser skrivna av andra programmerare, så kan antalet klasser lätt mätas i miljoner!

Det skulle vara nästan omöjligt att komma på unika namn för alla dessa miljoner, eller till och med bara tusentals, klasser.

Naturligtvis kan vi föreställa oss namn som A123och B345, men om vi pratar om att välja ett bra klassnamn, ett som gör det lättare att förstå klassen (som Stringför strängar, till exempel), så är det mycket att skapa tusen unika namn av arbete.

Det är därför det i Java är vanligt att gruppera klasser i paket med hjälp av nyckelordet paket.

Java-klasser och deras paket påminner mycket om filer och mappar på en dator.

Till exempel, om du behöver lagra 10 dokument på din dator, skulle du förmodligen bara ha dem i en mapp. Men vad händer om du har tusentals dokument (till exempel ett arkiv med alla ett företags dokument)?

Med tusentals dokument som ska lagras är en lösning att skapa mappar på flera nivåer med bra beskrivande namn. Och sedan i en mapp på den allra sista nivån, lagra dokumenten som relaterar till just den mappen. Bra beskrivande namn på dokumenten skadar inte heller.

Faktum är att vi gör allt detta för klasser i Java.

Filerna som innehåller klasserna lagras i olika kataloger (mappar), och det fullständiga namnet på klassens mapp med alla dess undermappar är namnet på paketet. Exempel:

Sökväg till filen Paketnamn Klassnamn
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Till skillnad från mappnamn använder paketnamn en punkt som avgränsare. Mappen \com\codegym\tasks\motsvarar med andra ord com.codegym.taskspaketet.


2. srcmapp

I Java är det vanligt att lagra alla klasser för ett program i en enda mapp (och undermappar). Denna mapp kallas vanligtvis src(förkortning för source ).

Den här mappen kallas projektroten (eller källroten ), och alla paketsökvägar är relativa till den. Exempel:

Mappar Paketnamn
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

I den här situationen säger programmerare något i stil med "vi har ett projekt som heter , mysom finns i c:\projects\datamappen" eller "vi har ett projekt som heter , projectsom finns i d:\files\git\datamappen"

Det är bäst att alltid lägga klasser i paket och inte direkt i rotmappen ( .src Om du bara har ett fåtal klasser är detta inga problem. Men när det finns många klasser är det väldigt lätt att bli förvirrad. , skapa alltid dina klasser endast i paket.

I Java är det vanligt att ge meningsfulla namn till klasser och paket. Många företag släpper sina egna bibliotek (en uppsättning klasser) och, för att undvika förvirring, införlivar de namnet på företaget/webbplatsen/projektet i namnet på paketet:

Paketnamn Företags-/projektnamn
org.apache.common
org.apache.tomcat
org.apache.util
Apache-projekt
com.oracle.jdbc
Oracle företag
java.io
javax.servlet
Oracle-företag, Java-projekt
com.ibm.websphere
IBM-företag, WebSphere-projektet
com.jboss
JBoss-projekt

3. Filinnehåll

Enligt språkstandarden Java måste information om ett klassnamn och namnet på dess paket finnas med i filen med koden. Den allmänna formen visas nedan:

package package-name;

public class ClassName
{

}

Paketnamnet måste matcha mappnamnet och filnamnet måste matcha det offentliga klassens namn.

Om du har en fil bör den innehålla detta:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Importera klasser

Klassnamnet och paketnamnet bildar det som kallas det fullständiga namnet klassen .

Exempel:

Fullständigt namn Paketnamn Klassnamn
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
ingen
Cat

De goda nyheterna:

Det fullt kvalificerade klassnamnet är alltid unikt inom ett projekt. När allt kommer omkring kan du inte skapa två filer med samma namn i en enda mapp.

De dåliga nyheterna:

Fullständigt kvalificerade klassnamn är vanligtvis antingen långa eller mycket långa. Och att skriva ut ett långt namn (till exempel java.util.ArrayList) varje gång i kod är väldigt obekvämt.

Det var därför Java lade till möjligheten att importera klasser .

Du kan använda en klasss kortnamn i din kod, men du måste först meddela kompilatorn vilket fullt kvalificerat klassnamn som motsvarar kortnamnet . Vad händer om du nu flera klasser med samma namn i ditt projekt? Eller så har du ursprungligen en, men sedan lades 15 till...

För att använda ett kort klassnamn i din kod måste du lägga till följande konstruktion:

import fully-qualified-class-name;

Denna deklaration ska läggas till i början av klassen, direkt efter deklarationen package.

Exempel:

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();
   }
}

Vi importerade två klasser ( java.util.Scanneroch com.test.helper.special.ArrayList), så vi kan använda deras korta namn i vår kod. Och kompilatorn kommer att veta vilka klasser som ska användas.

Och så här skulle samma kod se ut om vi inte hade använt 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();
   }
}

Förresten, om ditt projekt har två klasser som heter , Scannerkommer du inte att kunna importera båda till samma fil: du måste använda det långa namnet för en av dem.

Låt oss säga att du har en Jen i ditt lag. Det finns inga kommunikationsproblem, eftersom alla vet vem hon är. Men om det fanns tre Jens, så skulle fullt kvalificerade namn behöva användas för att skilja dem åt.

Anteckning 1

Förresten, om du är för lat för att lägga till massor av importsatser till din klass, kan du använda dess lata version: istället för ett specifikt klassnamn, sätt en asterisk:

import package-name.*;

Det gör att du kan använda korta namn på alla klasser i paketet.

Anteckning 2

Alla klasser i java.langpaketet importeras automatiskt, så du behöver inte skriva ett importuttalande för dem. Du kan säkert redan en av dessa klasser: java.lang.String. Ja det stämmer. Det här är Stringklassen som vi har använt för att arbeta med strängar.