Pachete, Import și Classpath
Pachete (Packages) în Java
Pachetele în Java reprezintă un mecanism de organizare a claselor și interfețelor în grupuri logice. Ele oferă:
- Organizare ierarhică a codului, similar cu directoarele într-un sistem de fișiere
- Spațiu de nume (namespace) pentru a evita conflictele de nume între clase
- Encapsulare la nivel de pachet prin modificatorul de acces implicit (package-private)
Declararea unui pachet se face în prima linie a fișierului sursă:
package com.example.myapplication;
public class MyCLass {
// implementare
}
Importul claselor
Importul în Java permite utilizarea claselor din alte pachete fără a specifica calea completă de fiecare dată. Există două tipuri de import:
- Import specific - importă o singură clasă:
import java.util.ArrayList;
- Import cu wildcard - importă toate clasele dintr-un pachet:
import java.util.*;
Importurile se plasează după declarația pachetului și înainte de definirea clasei.
Classpath și localizarea claselor
Classpath este un parametru care spune JVM și compilatorului Java unde să caute clasele și pachetele utilizate în aplicație. Classpath poate include:
- Directoare cu fișiere .class
- Arhive JAR sau ZIP
- Module (începând cu Java 9)
JVM caută clasele în următoarea ordine:
- Clasele din pachetul
java.lang
(importate implicit) - Clasele importate explicit
- Clasele din același pachet
- Clasele importate cu wildcard
Classpath poate fi specificat în mai multe moduri:
- Variabila de mediu
CLASSPATH
- Opțiunea
-classpath
sau-cp
la compilare sau la lansarea aplicației - În fișierele manifest ale arhivelor JAR
Încărcarea claselor de către JVM
JVM încarcă clasele folosind un mecanism numit Class Loading. Acest proces include trei etape principale:
- Încărcare (Loading) - Class Loader-ul citește bytecode-ul (.class) și creează o reprezentare a acestuia în memorie
- Legare (Linking) - include verificarea, pregătirea și rezolvarea referințelor
- Inițializare (Initialization) - execută blocurile statice și inițializează variabilele statice
JVM folosește trei Class Loadere principale:
- Bootstrap Class Loader - încarcă clasele de bază din JDK
- Extension Class Loader - încarcă clasele din directoarele de extensii
- Application Class Loader - încarcă clasele din classpath-ul aplicației
Clasele sunt încărcate “lazy” (la cerere), adică doar atunci când sunt referențiate pentru prima dată.
Alte concepte relevante
Numele complet al claselor (Fully Qualified Name)
Este numele complet al unei clase, incluzând pachetul (ex: java.util.ArrayList
).
Package-sealing
Permite “sigilarea” unui pachet, astfel încât toate clasele sale să provină din aceeași sursă (de obicei, același JAR).
Sistemul modular (începând cu Java 9)
Introdus prin Project Jigsaw, sistemul modular oferă un nivel de încapsulare mai înalt decât pachetele, permițând definirea explicită a dependențelor și expunerea controlată a pachetelor.
JAR files
Java Archive (JAR) sunt arhive care pot conține clase, resurse, metadate și un fișier manifest care specifică informații despre conținut.