Java - Pacchetti
I pacchetti vengono utilizzati in Java per prevenire conflitti di denominazione, per controllare l'accesso, per rendere più facile la ricerca / localizzazione e l'utilizzo di classi, interfacce, enumerazioni e annotazioni, ecc.
UN Package può essere definito come un raggruppamento di tipi correlati (classi, interfacce, enumerazioni e annotazioni) che forniscono protezione dell'accesso e gestione dello spazio dei nomi.
Alcuni dei pacchetti esistenti in Java sono:
java.lang - raggruppa le classi fondamentali
java.io - classi per input, funzioni di output sono raggruppate in questo pacchetto
I programmatori possono definire i propri pacchetti per raggruppare un gruppo di classi / interfacce, ecc. È buona pratica raggruppare le classi correlate implementate in modo che un programmatore possa facilmente determinare che le classi, le interfacce, le enumerazioni e le annotazioni sono correlate.
Poiché il pacchetto crea un nuovo spazio dei nomi, non ci saranno conflitti di nome con i nomi in altri pacchetti. Utilizzando i pacchetti, è più facile fornire il controllo degli accessi ed è anche più facile individuare le classi correlate.
Creazione di un pacchetto
Durante la creazione di un pacchetto, dovresti scegliere un nome per il pacchetto e includere un file package insieme a quel nome all'inizio di ogni file sorgente che contiene le classi, le interfacce, le enumerazioni e i tipi di annotazioni che si desidera includere nel pacchetto.
La dichiarazione del pacchetto dovrebbe essere la prima riga del file sorgente. Può esserci una sola istruzione del pacchetto in ogni file di origine e si applica a tutti i tipi nel file.
Se un'istruzione del pacchetto non viene utilizzata, la classe, le interfacce, le enumerazioni e i tipi di annotazione verranno inseriti nel pacchetto predefinito corrente.
Per compilare i programmi Java con le istruzioni del pacchetto, è necessario utilizzare l'opzione -d come mostrato di seguito.
javac -d Destination_folder file_name.java
Quindi una cartella con il nome del pacchetto specificato viene creata nella destinazione specificata e i file di classe compilati verranno inseriti in quella cartella.
Esempio
Vediamo un esempio che crea un pacchetto chiamato animals. È buona norma utilizzare nomi di pacchetti con lettere minuscole per evitare conflitti con i nomi di classi e interfacce.
Il seguente esempio di pacchetto contiene un'interfaccia denominata animali -
/* File name : Animal.java */
package animals;
interface Animal {
public void eat();
public void travel();
}
Ora, implementiamo l'interfaccia sopra nello stesso pacchetto di animali :
package animals;
/* File name : MammalInt.java */
public class MammalInt implements Animal {
public void eat() {
System.out.println("Mammal eats");
}
public void travel() {
System.out.println("Mammal travels");
}
public int noOfLegs() {
return 0;
}
public static void main(String args[]) {
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
Ora compila i file java come mostrato di seguito -
$ javac -d . Animal.java
$ javac -d . MammalInt.java
Ora un pacchetto / cartella con il nome animals verrà creato nella directory corrente e questi file di classe verranno inseriti in essa come mostrato di seguito.
È possibile eseguire il file di classe all'interno del pacchetto e ottenere il risultato come mostrato di seguito.
Mammal eats
Mammal travels
La parola chiave di importazione
Se una classe desidera utilizzare un'altra classe nello stesso pacchetto, non è necessario utilizzare il nome del pacchetto. Le classi nello stesso pacchetto si trovano senza alcuna sintassi speciale.
Esempio
Qui, una classe denominata Boss viene aggiunta al pacchetto del libro paga che contiene già Employee. Il Boss può quindi fare riferimento alla classe Employee senza utilizzare il prefisso del libro paga, come dimostrato dalla seguente classe Boss.
package payroll;
public class Boss {
public void payEmployee(Employee e) {
e.mailCheck();
}
}
Cosa succede se la classe Employee non è nel pacchetto del libro paga? La classe Boss deve quindi utilizzare una delle seguenti tecniche per fare riferimento a una classe in un pacchetto diverso.
- È possibile utilizzare il nome completo della classe. Ad esempio:
payroll.Employee
Il pacchetto può essere importato utilizzando la parola chiave import e il carattere jolly (*). Ad esempio:
import payroll.*;
- La classe stessa può essere importata utilizzando la parola chiave import. Ad esempio:
import payroll.Employee;
Note- Un file di classe può contenere un numero qualsiasi di istruzioni di importazione. Le istruzioni di importazione devono apparire dopo l'istruzione del pacchetto e prima della dichiarazione della classe.
La struttura delle directory dei pacchetti
Due risultati principali si verificano quando una classe viene inserita in un pacchetto:
Il nome del pacchetto diventa una parte del nome della classe, come abbiamo appena discusso nella sezione precedente.
Il nome del pacchetto deve corrispondere alla struttura della directory in cui risiede il bytecode corrispondente.
Ecco un modo semplice per gestire i tuoi file in Java:
Inserisci il codice sorgente per un tipo di classe, interfaccia, enumerazione o annotazione in un file di testo il cui nome è il nome semplice del tipo e la cui estensione è .java.
Ad esempio:
// File Name : Car.java
package vehicle;
public class Car {
// Class implementation.
}
Ora, metti il file sorgente in una directory il cui nome riflette il nome del pacchetto a cui appartiene la classe -
....\vehicle\Car.java
Ora, il nome della classe e il percorso qualificati sarebbero i seguenti:
- Nome classe → veicolo Auto
- Nome percorso → veicolo \ Car.java (in Windows)
In generale, un'azienda utilizza il nome di dominio Internet invertito per i nomi dei pacchetti.
Example- Il nome di dominio Internet di un'azienda è apple.com, quindi tutti i nomi dei suoi pacchetti inizieranno con com.apple. Ogni componente del nome del pacchetto corrisponde a una sottodirectory.
Example - L'azienda aveva un pacchetto com.apple.computers che conteneva un file sorgente Dell.java, sarebbe stato contenuto in una serie di sottodirectory come questa -
....\com\apple\computers\Dell.java
Al momento della compilazione, il compilatore crea un file di output diverso per ogni classe, interfaccia ed enumerazione definita in esso. Il nome di base del file di output è il nome del tipo e la sua estensione è.class.
Ad esempio:
// File Name: Dell.java
package com.apple.computers;
public class Dell {
}
class Ups {
}
Ora, compila questo file come segue usando l'opzione -d -
$javac -d . Dell.java
I file verranno compilati come segue:
.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class
Puoi importare tutte le classi o interfacce definite in \ com \ apple \ computers \ come segue:
import com.apple.computers.*;
Come i file sorgente .java, i file .class compilati dovrebbero trovarsi in una serie di directory che riflettono il nome del pacchetto. Tuttavia, il percorso dei file .class non deve essere lo stesso del percorso dei file di origine .java. Puoi organizzare separatamente le directory di origine e di classe, come:
<path-one>\sources\com\apple\computers\Dell.java
<path-two>\classes\com\apple\computers\Dell.class
In questo modo, è possibile dare accesso alla directory delle classi ad altri programmatori senza rivelare i propri sorgenti. È inoltre necessario gestire i file di origine e di classe in questo modo in modo che il compilatore e la Java Virtual Machine (JVM) possano trovare tutti i tipi utilizzati dal programma.
Il percorso completo della directory delle classi, <path-two> \ classes, è chiamato percorso della classe ed è impostato con la variabile di sistema CLASSPATH. Sia il compilatore che la JVM costruiscono il percorso dei file .class aggiungendo il nome del pacchetto al percorso della classe.
Diciamo che <path-two> \ classes è il percorso della classe e il nome del pacchetto è com.apple.computers, quindi il compilatore e JVM cercheranno i file .class in <path-two> \ classes \ com \ apple \ computers.
Un percorso di classe può includere diversi percorsi. Più percorsi devono essere separati da un punto e virgola (Windows) o da due punti (Unix). Per impostazione predefinita, il compilatore e la JVM cercano la directory corrente e il file JAR contenente le classi della piattaforma Java in modo che queste directory siano automaticamente nel percorso classe.
Imposta la variabile di sistema CLASSPATH
Per visualizzare la variabile CLASSPATH corrente, utilizzare i seguenti comandi in Windows e UNIX (Bourne shell):
- In Windows → C: \> imposta CLASSPATH
- In UNIX →% echo $ CLASSPATH
Per eliminare il contenuto corrente della variabile CLASSPATH, utilizzare -
- In Windows → C: \> imposta CLASSPATH =
- In UNIX →% unset CLASSPATH; esporta CLASSPATH
Per impostare la variabile CLASSPATH -
- In Windows → imposta CLASSPATH = C: \ users \ jack \ java \ classes
- In UNIX →% CLASSPATH = / home / jack / java / classes; esporta CLASSPATH