You are on page 1of 7

7.

Pachete

7. Pachete

• Formarea numelui pachetelor


• Importarea tipurilor
• Controlul accesului prin pachete
• Pachete din distribuţia standard Java

2
7. Pachete: noţiuni generale
• Pachet: mecanism de modularizare a programelor situat deasupra
claselor
• Conţine, de regulă, un grup de clase înrudite; mai poate avea:
interfeţe, subpachete, fişiere
• Se pot distribui independent şi joacă rol similar bibliotecilor din
limbajele ne-obiectuale
• Alt rol important: constituie spaţii de nume
• Sunt şi mecanism pentru controlul accesului la clase şi la membrii
claselor
• Apartenenţa codului dintr-un fişier sursă la un pachet se indică prin:
package numepachet;
• Declaraţia de pachet poate apare doar la începutul fişierului, o
singură dată
• Numele pachetului prefixează implicit numele oricărui tip conţinut în
acel pachet
• Dacă declaraţia package nu apare într-un fişier sursă, tipurile din
fişier fac parte din pachetul anonim.
3

7.1. Formarea numelui pachetelor


• Numele pachetelor dintr-o aplicaţie trebuie să fie unice:
nu există mecanism de dezambiguare mai sus de
spaţiile de nume asigurate de pachete
• Soluţia propusă de creatorul limbajului: prefixarea
numelui de pachet cu numele de domeniu Internet al
firmei/instituţiei, scris în ordine inversă
• Exemplu: ro.upt.cs.an2.pachetulmeu
• Pachetele din distribuţia Java au ca primă componentă a
numelui java
• Există şi pachete din “extensia Java”, al căror nume
începe cu javax

4
7.2. Importarea tipurilor (1)
• Numele de tip în care apare şi • Import de tip singular:
numele pachetului: nume import
complet calificat numepachet.NumeClasa;
• În cod din afara pachetului se • Toate tipurile din acelaşi
folosesc nume complet pachet sunt importate implicit
calificate sau se importă • Pachetul java.lang este
complet sau parţial pachetul importat implicit în orice cod
• Importul se face plasarea Java
declaraţiei import la • Mecanismul de import din Java
începutul unui fişier sursă,
după o eventuală declaraţie este pasiv: informaţiile despre
package un pachet se citesc la
compilare doar când se
• Import la cerere (toate tipurile foloseşte un tip
din pachet se pot folosi cu • Există un set de reguli pentru a
nume simple:
determina numele complet
import numepachet.*; calificat al tipului unei referinţe

7.2. Importarea tipurilor (2)


• Regulile: • Mecanismul de import se poate
folosi şi pentru tipurile încuibate
– Se compară cu tipul curent, (nu se recomandă):
inclusiv cele moştenite de import
acesta numepachet.Extern.Intern;
– Se compară cu tipurile • Prin package şi import se por
încuibate în tipul curent rezolva conflicte de nume când
– Se compară cu tipurile acelaşi nume de tip apare în două
importate explicit (singular) pachete. Exemple:
– Toate tipurile celor 2 pachete se
– Se compară cu alte tipuri referă prin nume complet calificate
declarate în acelaşi pachet – Se importă la cerere un pachet
– Se compară cu tipurile – Se importă ambele pachete şi se
importate implicit (la califică complet numele în conflict
cerere) • Din motive de conflict este interzis
ca într-un fişier să se importe un
tip cu acelaşi nume ca un tip
definit în fişier

6
7.3. Controlul accesului prin
pachete
• Subpachetele sunt doar o modalitate de a organiza pachete
înrudite, nu se creează relaţie de moştenire
• Ex.: java.lang, java.io, java.net sunt subpachete pentru
java, iar java.util.concurrent este subpachet al lui
java.util
• Din java.util.concurrent nu sunt direct accesibile tipurile
declarate în java.util
• Dar: în cadrul unui pachet orice clasă poate accesa orice membri
din alte clase ale pachetului, care nu sunt declaraţi private în
acele clase
• Tipurile pot defini pentru membrii ne-privaţi 3 contracte diferite:
– Contractul public: principala funcţionalitate a tipului (interfeţele au numai
acest contract)
– Contractul protejat cu funcţionalitate disponibilă numai subtipurilor
– Contractul de pachet: funcţionalitate disponibilă în cadrul pachetului

7.3.1. Precizări asupra înlocuirii


metodelor (1)
• Evident, o metodă poate fi înlocuită protected void protejata () {
într-o subclasă numai dacă metoda din System.out.println("Super
superclasă este accesibilă clasa.protejat()");
• Exemplu: codul unei superclase: }
package P1;
public void publica ()
public class Superclasa { { System.out.println("Sup
ercla sa.public()");
private void privata () }
{
System.out.println( public final void apeluri() {
“Superclasa.privat()"); privata();
} pachet();
protejata();
void pachet () { publica();
System.out.println( }
“Superclasa.pachet()"); }
}
• A cincea metodă a clasei e declarată
final pentru a nu putea fi înlocuită

8
7.3.1. Precizări asupra înlocuirii
metodelor (2)
• Într-un alt pachet se importă clasa public void publica () {
P1.Superclasa şi se defineşte System.out.println("Subc
Subclasa1 ca subclasă a acesteia: lasa1.publica()");
package P2; }
import P1.Superclasa;
public static void
public class Subclasa1 main(String[] args){
extends Superclasa { new Subclasa1().apeluri();
public void privata () { }
System.out.println("Subc
lasa1.privata()"); }
}
• Rezultatul execuţiei:
public void pachet () {
System.out.println("Subc Superclasa.privata()
lasa1.pachet()"); Superclasa.pachet()
} Subclasa1.protejata()
Subclasa1.publica()
public void protejata () {
System.out.println("Subc
lasa1.protejata()");
}

7.3.1. Precizări asupra înlocuirii


metodelor (3)
• O altă subclasă, Subclasa2, derivată public void protejata () {
din Subclasa1, în pachetul P1 System.out.println("Subcla
(nerecomandabil, dar posibil): sa 2.protejata()");
}
package P1; public void publica ()
import P2.Subclasa1; { System.out.println("Sub
clasa 2.publica()");
public class Subclasa2 }
extends Subclasa1 {
public static void
public void privata () { main(String[] args){
System.out.println("Subc new Subclasa2().apeluri();
lasa2.privata()");
} }
}
public void pachet () {
System.out.println("Subc • Rezultatul execuţiei:
lasa2.pachet()"); Superclasa.privata()
} Subclasa2.pachet()
Subclasa2.protejata()
Subclasa2.publica()

10
7.3.1. Precizări asupra înlocuirii
metodelor (4)
• Subclasa2 plasată într-un alt pachet: public void publica ()
package P3; { System.out.println("Subclas
import P1.Subclasa2; a 3.publica()");
}
public class Subclasa3
extends Subclasa2 { public static void
public void privata () { main(String[] args){
System.out.println("Subc new Subclasa3().apeluri();
lasa3.privata()"); }
}
}
public void pachet () { • Rezultatul execuţiei:
System.out.println("Subc Superclasa.privata()
lasa3.pachet()"); Subclasa3.pachet()
} Subclasa3.protejata()
Subclasa3.publica()
public void protejata () {
System.out.println("Subc • Aparent a fost înlocuită metoda
lasa3.protejata()"); pachet()din Superclasa,
} inaccesibilă în alt pachet. În realitate a
fost înlocuită metoda publică
pachet() din Subclasa2

11

7.3.2. Compilarea şi execuţia


claselor din pachete (1)

12
7.3.2. Compilarea şi execuţia
claselor din pachete (2)
• Se sugerează în definiţia limbajului folosirea facilităţilor sistemului de fişiere
al platformei de implementare pentru memorarea fişierelor cu surse Java
• În practică: director separat pentru fiecare pachet, conţine toate fişierele
sursă ale pachetului (Obs.: un fişier poate conţine o singură clasă public)
• Pentru subpachete se creează subdirectoare ale directorului pentru
pachetul de rang superior
• Se mai recomandă ca toate directoarele de pachete să fie subdirectoare ale
unui director de rang superior (src)
• Organizare asemănătoare se recomandă pentru fişierele .class
• Ţinând cont de organizarea fişierelor se precizează cum se poate realiza
compilarea fişierelor sursă asftel încât fişierele .class să ajungă la
destinaţia dorită
• Se consideră că programul sursă este memorat în fişierul Tip1.java şi că
clasa Tip1 are o metodă main
• Fişierul Tip1.java trebuie să aibă la începutul său linia:

package pachet.subpachet;

13

7.3.2. Compilarea şi execuţia


claselor din pachete (3)
• Compilarea se face considerând director curent directorul în care se află
fişierul sursă cu comanda:
javac –d ../../../class Tip1.java
• Datorită directivei package din fişierul sursă, compilatorul va pune
rezultatul compilării în subdirectorul pachet/subpachet al directorului
class (dacă aceste directoare nu există, se creează implicit)
• Pentru lansarea în execuţie a codului din Tip1.class se poate proceda în
mai multe moduri, cel mai simplu considerând director curent directorul
class:
cd ../../../class
java pachet.subpachet.Tip1
• Alt mod: indiferent de poziţia momentană a utilizatorului în sistemul de
fişiere, se foloseşte opţiunea –classpath (prescurtat -cp) la lansarea
interpretorului:
java –cp java/class pachet.subpachet.Tip1
(s-a considerat director curent directorul gazdă al utilizatorului, în care este
creat directorul java)

14

You might also like