1. Pachete

Programele Java obișnuite implică un număr enorm de clase. Câți? Mii, zeci de mii. Și dacă luați în considerare și faptul că programul folosește diverse biblioteci care conțin clase scrise de alți programatori, atunci numărul de clase poate fi ușor măsurat în milioane!

Ar fi aproape imposibil să venim cu nume unice pentru toate aceste milioane, sau chiar doar mii, de clase.

Desigur, ne putem imagina nume precum A123și B345, dar dacă vorbim despre alegerea unui nume de clasă bun, unul care să faciliteze înțelegerea clasei (cum ar fi Stringpentru șiruri, de exemplu), atunci chiar și a genera o mie de nume unice este mult a muncii.

De aceea, în Java se obișnuiește gruparea claselor în pachete folosind cuvântul cheie package.

Clasele Java și pachetele lor sunt foarte asemănătoare cu fișierele și folderele de pe un computer.

De exemplu, dacă trebuie să stocați 10 documente pe computer, probabil le-ați păstra într-un singur folder. Dar dacă aveți mii de documente (de exemplu, un depozit al tuturor documentelor unei companii)?

Având mii de documente de stocat, o soluție este de a crea mai multe niveluri de foldere cu nume descriptive bune. Și apoi într-un folder de la ultimul nivel, stocați documentele care se referă la acel folder anume. Nici numele descriptive bune pentru documente nu strica.

De fapt, facem toate acestea pentru clase în Java.

Fișierele care conțin clasele sunt stocate în diferite directoare (foldere), iar numele complet al folderului clasei cu toate subfolderele sale este numele pachetului. Exemplu:

Calea către fișier Numele pachetului Numele clasei
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Spre deosebire de numele folderelor, numele pachetelor folosesc un punct ca delimitator. Cu alte cuvinte, folderul \com\codegym\tasks\corespunde pachetului com.codegym.tasks.


2. srcdosar

În Java, se obișnuiește să stocați toate clasele pentru un program într-un singur folder (și subdirectoare). Acest folder este de obicei numit src(prescurtare de la sursă ).

Acest folder se numește rădăcină de proiect (sau rădăcină sursă ) și toate căile de pachet sunt relative la acesta. Exemple:

Foldere Numele pachetului
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

În această situație, programatorii spun ceva de genul „avem un proiect numit my, care se află în c:\projects\datafolder” sau „avem un proiect numit project, care se află în d:\files\git\datafolder”

Cel mai bine este să puneți întotdeauna clase în pachete și nu direct în folderul rădăcină ( src. Dacă aveți doar câteva clase, acest lucru nu prezintă nicio problemă. Dar când sunt multe clase, este foarte ușor să vă confundați. Deci , creați-vă întotdeauna clasele numai în pachete.

În Java, se obișnuiește să se dea nume semnificative claselor și pachetelor. Multe companii își lansează propriile biblioteci (un set de clase) și, pentru a evita confuziile, încorporează numele companiei/site-ului/proiectului în numele pachetului:

Numele pachetului Numele companiei/proiectului
org.apache.common
org.apache.tomcat
org.apache.util
Proiectul Apache
com.oracle.jdbc
Compania Oracle
java.io
javax.servlet
Compania Oracle, proiect Java
com.ibm.websphere
Compania IBM, proiect WebSphere
com.jboss
Proiectul JBoss

3. Conținutul fișierului

Conform standardului limbajului Java, informațiile despre numele unei clase și numele pachetului acesteia trebuie incluse în fișierul cu codul. Forma generală este prezentată mai jos:

package package-name;

public class ClassName
{

}

Numele pachetului trebuie să se potrivească cu numele folderului, iar numele fișierului trebuie să se potrivească cu numele clasei publice.

Dacă aveți un fișier, atunci acesta ar trebui să conțină acest lucru:...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. Importul claselor

Numele clasei și numele pachetului formează ceea ce se numește numele complet calificat al clasei .

Exemple:

Nume complet calificat Numele pachetului Numele clasei
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
nici unul
Cat

Veștile bune:

Numele de clasă complet calificat este întotdeauna unic în cadrul unui proiect. La urma urmei, nu puteți crea două fișiere cu același nume într-un singur folder.

Vestea proastă:

Numele de clasă complet calificate sunt de obicei lungi sau foarte lungi. Și scrierea unui nume lung (de exemplu, java.util.ArrayList) de fiecare dată în cod este super incomod.

De aceea, Java a adăugat capacitatea de a importa clase .

Puteți utiliza numele scurt al unei clase în codul dvs., dar mai întâi trebuie să informați compilatorul care nume de clasă complet calificat corespunde numelui scurt . Ce se întâmplă dacă acum ai mai multe clase cu același nume în proiectul tău? Sau ai inițial unul, dar apoi au fost adăugate încă 15...

Pentru a utiliza un nume scurt de clasă în codul dvs., trebuie să adăugați următorul construct:

import fully-qualified-class-name;

Această declarație trebuie adăugată chiar la începutul orei, imediat după packagedeclarație.

Exemplu:

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

Am importat două clase ( java.util.Scannerși com.test.helper.special.ArrayList), astfel încât să putem folosi numele lor scurte în codul nostru. Și compilatorul va ști ce clase să folosească.

Și iată cum ar arăta același cod dacă nu am fi folosit 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();
   }
}

Apropo, dacă proiectul tău are două clase numite Scanner, nu le vei putea importa pe ambele în același fișier: va trebui să folosești numele lung pentru una dintre ele.

Să presupunem că ai un Jen în echipa ta. Nu există probleme de comunicare, deoarece toată lumea știe cine este. Dar dacă ar exista trei Jen, atunci ar trebui folosite nume complet calificate pentru a le distinge.

Nota 1

Apropo, dacă ești prea leneș să adaugi o mulțime de instrucțiuni de import în clasa ta, poți folosi versiunea leneșă a acesteia: în loc de un anumit nume de clasă, pune un asterisc:

import package-name.*;

Acest lucru vă va permite să utilizați numele scurte ale tuturor claselor din pachet.

Nota 2

Toate clasele din java.langpachet sunt importate automat, deci nu trebuie să scrieți o importdeclarație pentru ele. Cu siguranță știți deja una dintre aceste clase: java.lang.String. Da, așa e. Aceasta este Stringclasa pe care am folosit-o pentru a lucra cu șiruri.