Pachete
În Java, clasele sunt de obicei grupate în pachete. Pachetele permit organizarea logică a claselor în seturi. Implicit, Java are deja o serie de pachete încorporate, cum ar fi java.lang, java.util, java.io etc. În plus, pachetele pot avea pachete încorporate.
Organizarea claselor sub formă de pachete ajută la evitarea conflictelor de nume între clase. De multe ori, dezvoltatorii numesc clasele lor la fel. Apartenența la un pachet asigură unicitatea numelui.
Pentru a specifica că o clasă aparține unui anumit pachet, trebuie folosită directiva package, urmată de numele pachetului:
package nume_pachet;
De obicei, denumirile pachetelor corespund structurii fizice a proiectului, adică organizării directoarelor în care se află fișierele sursă. Calea către fișierele din proiect corespunde numelui pachetului acelor fișiere.
De exemplu, dacă clasele aparțin pachetului mypack, atunci acestea vor fi plasate în proiect în folderul mypack.
Nu este obligatoriu să definești clasele într-un pachet. Dacă o clasă nu este definită într-un pachet, atunci se consideră că aceasta aparține pachetului implicit, care nu are un nume.
De exemplu, vom crea în folderul pentru fișierele sursă un director numit study. În acesta, vom crea un fișier Program.java cu următorul cod:
package study;
public class Program {
public static void main(String[] args) {
Person kate = new Person("Kate", 32);
kate.displayInfo();
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
void displayInfo() {
System.out.printf("Name: %s \t Age: %d \n", name, age);
}
}
Directiva package study din începutul fișierului indică faptul că clasele Program și Person, care sunt definite aici, aparțin pachetului study.
Când lucrăm într-un mediu de dezvoltare, cum ar fi NetBeans, IDE-ul se ocupă de toate problemele legate de compilarea pachetelor și fișierelor din acestea. Astfel, este suficient să apăsăm un buton și totul va fi pregătit.
Cu toate acestea, dacă compilăm programul din linia de comandă, putem întâmpina unele dificultăți. Prin urmare, vom analiza acest aspect.
Pentru a compila programul, mai întâi, în linia de comandă/terminal, folosim comanda cd pentru a ne deplasa la folderul unde se află directorul study.
cd D:\Workspace
De exemplu, în cazul meu, acesta este directorul D:\Workspace(adică fișierul sursă este localizat la caleaD:\Workspace\study\Program.java).
Pentru a compila, executăm comanda:
javac study\Program.java
După aceasta, în folderul study vor apărea fișierele compilate Program.class și Person.class. Pentru a lansa programul, executăm comanda:
java study.Program

Importul pachetelor și claselor
Dacă trebuie să folosim clase din alte pachete, atunci trebuie să importăm acele pachete și clase. Excepție fac clasele din pachetul java.lang (de exemplu, String), care sunt importate automat în program.
De exemplu, clasa Scanner, cunoscută din temele anterioare, se află în pachetul java.util, astfel încât putem obține acces la ea în felul următor:
java.util.Scanner in = new java.util.Scanner(System.in);
Adică, indicăm calea completă către fișierul din pachet la crearea obiectului. Totuși, această formă lungă de nume de pachete nu este întotdeauna convenabilă, iar ca alternativă, putem importa pachetele și clasele în proiect folosind directiva import, care este specificată după directiva package:
package study;
import java.util.Scanner; // importul clasei Scanner
public class Program {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
}
}
Directiva import este specificată la începutul codului, după care urmează numele clasei importate (în acest caz, clasa Scanner).
În exemplul de mai sus, am importat doar o singură clasă, însă pachetul java.util conține multe alte clase. Și pentru a nu importa fiecare clasă individual, putem importa întregul pachet:
import java.util.*; // importul tuturor claselor din pachetul java.util
Acum putem folosi orice clasă din pachetul java.util.
Există o situație în care folosim două clase cu același nume din două pachete diferite, de exemplu, clasa Date există atât în pachetul java.util, cât și în pachetul java.sql. Dacă trebuie să folosim ambele clase simultan, trebuie să indicăm calea completă către aceste clase din pachet:
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date();
Importul static
În Java, există și o formă specială de import - importul static. Pentru aceasta, împreună cu directiva import se folosește modificatorul static:
package study;
import static java.lang.System.*;
import static java.lang.Math.*;
public class Program {
public static void main(String[] args) {
double result = sqrt(20);
out.println(result);
}
}
Aici se face importul static al claselor System și Math. Aceste clase au metode statice. Datorită operației de import static, putem folosi aceste metode fără a specifica numele clasei.
De exemplu, putem scrie nu Math.sqrt(20), ci sqrt(20), deoarece funcția sqrt(), care returnează rădăcina pătrată a unui număr, este statică. (Mai târziu vom analiza membrii statici ai clasei).
Același lucru este valabil și pentru clasa System: în ea este definit obiectul static out, așa că îl putem folosi fără a specifica clasa.