# Java/Package

| Java Linguaggio Java categoria · sviluppo · Come posso contribuire? → Vai su Wikiversity | Java: Guida alla programmazioneJava/Introduzione - Specifica di linguaggio - Libreria standardJava/Comunicazione seriale Tipi di datoJava/Tipi di dato • EspressioniJava/Operatori • VariabiliJava/Variabili locali • IstruzioniJava/Istruzioni • Strutture di controlloJava/Strutture di controllo • PackageJava/Package Classi e oggettiJava/Classi e oggetti • OggettiJava/Oggetti • MetodiJava/Metodi • Metodi (cont.)Java/Metodi/2 • ArrayJava/Array Modificatori di accessoJava/Modificatori di accesso • EreditarietàJava/Ereditarietà Gestione delle eccezioniJava/Gestione delle eccezioni • GenericsJava/Generics Thread e parallelismoJava/Multithreading • Interblocco ricontrollatoJava/Interblocco ricontrollato Alcune differenze con il CJava/Concetti fondamentali • LessicoJava/Lessico • GrammaticaJava/Grammatica |

## Premessa

Il codice sorgente di un programma Java è costituito da un insieme di moduli, ognuno dei quali definisce una classe. Essi sono chiamati "unità di compilazione" (in inglese compilation unit). La definizione esatta di "unità di compilazione" dipende dal sistema di sviluppo in uso. Ad esempio, è possibile salvare le unità di compilazione all'interno di un database.
Tuttavia, spesso, le unità di compilazione sono definite come dei comuni file di testo che risiedono in una apposita cartella e che hanno estensione .java.
Il codice sorgente si scrive in un editor di testo che supporti Unicode, o con degli IDE; ad esempio, rispettivamente, il "Blocco note" di Windows e "NetBeans".

## Il sorgente Java
### Unità di compilazione

Le unità di compilazione sono organizzate in gruppi, chiamati packages. Nel caso in cui esse siano dei file, i packages sono le cartelle. I packages sono organizzati gerarchicamente, e all'interno del codice Java questa gerarchia è stabilita tramite il simbolo punto: ad esempio, java.lang è un sottopackage del package java.

### L'albero delle directory

Tutti i sorgenti Java che costituiscono un programma vengono tipicamente messi insieme al di sotto di un'unica cartella radice. La struttura delle cartelle deve riflettere la struttura dei package a cui le varie classi appartengono.

## Il formato di una unità di compilazione

Un'unità di compilazione è composta dalle seguenti sezioni, in questo ordine:
* indicazione del package cui appartiene la classe;
* sezione degli import;
* definizione vera e propria della classe.
Uno stesso file può contenere più di una definizione di classe, ma in questo caso non più di una di esse può essere public. Se ce ne è una public, allora questa deve coincidere con il nome del file.

## Archiviare le classi

I package sono meri contenitori di classi esattamente come le directory lo sono per i files e tra l'altro vale la stessa regola: nello stesso package non vi possono essere due classi con lo stesso nome così come nella stessa directory non vi possono essere due file con lo stesso nome.
Il programmatore così come può creare sue classi così può ordinarle in suoi package. Ordinare proprie classi può servire a ritrovarle con facilità e a riusarle, vedremo poi come, con altrettanta facilità.
Il programmatore può assegnare una classe ad un suo package usando la parola chiave package seguita da un nome attribuitogli, caratterizzante l'insieme delle classi; con questa sintassi:
Il nome del package dovrebbe essere indicativo delle caratteristiche della collezione delle classi. Per archiviare la classe "HelloWorld". che abbiamo visto prima, in un package di nome "saluti" dobbiamo scrivere:
I nomi del package devono avere una corrispondenza diretta nel filesystem: ad esempio, se si vuole archiviare il file helloWorld.class nella cartella “saluti” del file system, la cartella "saluti" dovrà essere presente, perché è qui che vogliamo conservare il file insieme ad altri dello stesso argomento e crearci la nostra collezione di classi.
Il package può avere anche più directory. Con più directory cambia di poco: metteremo un punto “.” tra una directory e l'altra; la jvm cambierà automaticamente il punto nel carattere separatore del sistema operativo usato e la classe dovrà essere archiviata nell'ultima sottodirectory.
Facciamo, per esempio, delle classi di saluto simili ad HelloWorld, in molte lingue, per tirarle fuori al bisogno, secondo la lingua parlata dagli utenti del programma.
Faremo questi file, notare il nome del package che ora sono con una directory e e una sottodirectory separate dal punto:
e
e
Se archivio con un package così: “packages saluti.italia.dialetto”, allora ci sarà la cartella dialetto come sottodirectory della cartella italia. All'interno di dialetto dovranno esserci i file corrispondenti dei saluti italiani in dialetto, ognuno con un diverso nome.
L' istruzione
è facoltativa, è possibile non metterla: se queste non c'è, il compilatore inserisce la classe in un package di default.

## Importare le classi

Per usare le classi dei package bisogna scrivere la parola chiave import:
Vogliamo riusare le classi che abbiamo già fatto. Per farlo dobbiamo dire all'interprete dove sono le classi e in contemporanea quali sono. Se volessimo richiamare le nostre classi, prima archiviate, dovremo scrivere nel codice
Se non mettessimo l'asterisco dovremo mettere il nome preciso del file.class. Invece e quasi sempre, abbiamo bisogno di riusare molte classi e perciò è comodo l'asterisco.
Faremo questo codice per i saluti in inglese: