Concetti Chiave
- Le classi Java possono essere accessibili solo all'interno dello stesso package a meno che non siano dichiarate come public.
- Il modificatore public deve essere utilizzato per consentire l'accesso a classi e membri da parte di altre classi esterne al package.
- Il codice sorgente di una classe pubblica deve essere salvato in un file con lo stesso nome della classe e con estensione ".java".
- È consentita solo una classe pubblica per file di sorgente, per garantire una chiara organizzazione e accesso ai file compilati.
- La struttura di un file sorgente con una sola classe pubblica semplifica la ricerca di sorgenti e bytecode da parte dei programmatori.
Accesso alle classi Java
Di default, la definizione di una classe Java può essere utilizzata solo dalle classi all’interno del suo stesso package. Per esempio, assumiamo di aver scritto una applicazione in un file Appo.java non appartenente a nessun package e, supponiamo che esista una classe Stack appartenente al package app.stack . Per definizione, Appo.java non potrà accedere alla definizione di classe di Stack.
package app.stack;
class Stack
{
int data[];
int ndata;
void push(int i)
{
……
}
int pop()
{
……..
}
}
Modificatore public in Java
Java richiede al programmatore di esplicitare quali classi e quali membri possano essere utilizzati all’esterno del package. A questo scopo Java riserva il modificatore public da utilizzare prima della dichiarazione della classe o di un membro come mostrato nella nuova versione della classe Stack detta ora classe pubblica.
package app.stack;
public class Stack
{
int data[];
int ndata;
public void push(int i)
{
……
}
public int pop()
{
……..
}
}
Regole di memorizzazione del codice
Le specifiche del linguaggio richiedono che il codice sorgente di classe pubblica sia memorizzata in un file avente lo stesso nome della classe (incluse maiuscole e minuscole), ma con estensione “.java”. Come conseguenza alla regola, può esistere solo una classe pubblica per ogni file di sorgente. Questa regola è rinforzata dal compilatore che scrive il bytecode di ogni classe in un file avente lo stesso nome della classe (incluse maiuscole e minuscole), ma con estensione “.class”.
Organizzazione delle classi pubbliche
Lo scopo di questa regola è quello di semplificare la ricerca di sorgenti e bytecode da parte del programmatore. Per esempio supponiamo di avere tre classi A, B e C in un file unico. Se A fosse la classe pubblica (solo una lo può essere), il codice sorgente di tutte e tre le classi dovrebbe trovarsi all’interno di un file A.java . Quando A.java verrà compilato, il compilatore creerà una classe per ogni classe nel file: A.class, B.class e C.class .
Questa organizzazione per quanto contorta, ha un senso logico. Se come detto la classe pubblica è l’unica a poter essere eseguita da altre classi all’esterno del package, le altre classi rappresentano solo l’implementazione di dettagli non necessarie al di fuori del package.
Domande da interrogazione
- Qual è la visibilità predefinita delle classi in Java?
- Qual è la funzione del modificatore public in Java?
- Quali sono le regole per la memorizzazione del codice sorgente di una classe pubblica?
Di default, una classe Java è accessibile solo dalle classi all'interno dello stesso package, come illustrato nell'esempio di Appo.java e Stack nel package app.stack.
Il modificatore public consente di rendere una classe o un membro accessibile anche al di fuori del package, come mostrato nella versione pubblica della classe Stack.
Il codice sorgente di una classe pubblica deve essere memorizzato in un file con lo stesso nome della classe e con estensione ".java", e può esistere solo una classe pubblica per file, come spiegato nella regola di organizzazione delle classi.