Un package è un insieme di classi
Di solito, un package contiene classi correlate fra loro
Esempio: nel package java.awt ci sono le classi Point, Rectangle ecc
La classe Point sta nel package java.awt
Tre modi per usare questa classe:
import java.awt.*; class Prova { Point p; }
import java.awt.Point; class Prova { Point p; }
class Prova { java.awt.Point p; }
Tutte le classi del package devono stare nella stessa directory
Ogni file inizia con la dichiarazione:
package nomepackage;
directory pack/:
|
Quello che conta sono i file .class
Nella figura sono stati messi i corrispondenti file sorgente .java
Il nuovo package si può usare come quelli predefiniti
Per esempio:
import pack.*; class Prova { public static void main(String args[]) { Uno a=new Uno(); a.x=12; } }
Per le classi, esistono due livelli di accesso:
Quando non si scrive nulla, l'accesso è consentito soltanto alle altri classi dello stesso package
Nelle classi del nostro package:
Esistono quattro livelli di accesso:
Anche qui, nessuna specifica=accesso solo da altre classi dello stesso package
package pack; public class Uno { public int x; int y; private int z; }
Lo stesso vale anche per i metodi
Se in una classe non si specifica un package:
Esiste un package di default, che contiene tutte le classi che non hanno una specifica di package
Quando si omette la specifica di accesso, si permette l'accesso all'interno dello stesso package
Vale anche in nel caso del package senza nome
Se una componente o metodo è dichiarata protected allora è visibile:
A che serve?
Il livello di accesso di default (nessuna specifica di accesso) impedisce l'accesso a tutte le classi fuori dal package, anche le sottoclassi
Con protected, le sottoclassi hanno accesso
Principio generale: restringere il più possibile
Riformulato: permettere l'accesso solo alle classi, componenti e metodi di cui le altre classi hanno realmente bisogno
Conseguenza: non permettere l'accesso a metodi e componenti ausiliari
Vantaggio: se si cambia l'implementazione, le altre classi non hanno bisogno di modifiche
Rendere private tutte le componenti, e pubblici solo i metodi che fanno operazioni permesse alle altre classi
class Incap { private int x; public int getX() { return this.x; } public void setX(int x) { this.x=x; } }
Vantaggio: posso restringere/eliminare l'accesso in lettura o scrittura modificando i metodi
Posso aggiungere controlli (es., x deve essere positivo)