Package Pacchetti e interfacce 28/12/2001 package 1 Package Più classi o interfacce interrelate possono essere riunite in un package, dotato di nome Esempio: classe o interfaccia MyPackage c b a d 28/12/2001 package e 2 Nomi di classi Il nome di una classe va sempre qualificato con il nome del package a cui appartiene, tranne quando viene usato all’interno dello stesso package Esempio: aaa.bbb.ccc.MyClass all’interno di aaa.bbb.ccc basta MyClass 28/12/2001 package 3 Nomi di package Il nome di un package può essere composto da più identificatori separati da “.”: luca.utilities.internet Per evitare che package di produttori diversi abbiano lo stesso nome, si suggerisce di far iniziare il nome del package con il dominio Internet del produttore (invertito, e con il nome di più alto livello tutto maiuscolo): IT.unipv.vision.luca.utilities.internet 28/12/2001 package 4 Pacchetti standard java.lang classi base del linguaggio Object, Thread, Throwable, System, String, Math, wrapper classes, …) java.io classi di I/O FileInputStream, FileOutputStream java.util classi di utilità Date, Random, … 28/12/2001 java.net classi di supporto alle applicazioni di rete (socket, URL, …) java.applet classe Applet, … java.awt Abstract Windowing Toolkit package 5 L’istruzione package Specifica che le classi che seguono appartengono a un certo package Deve apparire all’inizio di una unità di compilazione Esempio: a.java package p; class a {.. class b {... le classi a,b,c appartengono al package p Se lo statement è omesso, la classe appartiene al package anonimo class c {.. 28/12/2001 package 6 L’istruzione import Per evitare di usare sempre nomi completi di classi, si può usare lo statement import Esempio: import java.util.Date; class MyClass { Date today; ... } class MyClass { java.util.Date today; … } Note: import java.util.* importa tutte le classi del package java.util java.lang.* è sempre importato implicitamente 28/12/2001 package 7 Package e directory Molti ambienti Java mappano i nomi dei package sui pathname del file system Esempio: aaa.bbb.ccc.MyClass package aaa/bbb/ccc/MyClass.class classe directories file pathname 28/12/2001 package 8 CLASSPATH Per indicare al class loader da quale directory partire per la mappatura può essere usata la variabile di ambiente CLASSPATH Esempio (Unix): setenv CLASSPATH /classi : /usr/luca/classi : . 28/12/2001 package 9 Visibilità Classi e interfacce sono visibili all’interno del package in cui sono dichiarate; sono visibili all’esterno del package solo se dichiarate public public class a { … public interface b { … Membri (campi e metodi) sono visibili quando: la loro classe è visibile e il loro modificatore li rende visibili 28/12/2001 package 10 più visibile Visibilità di campi e metodi Modificatore Visibilità private solo nella classe in cui è definito nessuno (default) solo nelle classi del package protected classi nel package e sottoclassi public tutte le classi NB: I membri di una interfaccia sono sempre pubblici 28/12/2001 package 11 esempio package pac class a {... class b { private int i; private void m( ) {…} int j; visibile void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…} package pac; class c {... class classddextends extendsbb{... {... class e extends d {... 28/12/2001 package 12 Progettare la Visibilità Quando progettiamo una classe dobbiamo pensare a due tipi di utenti: quelli che utilizzeranno la classe per realizzare delle applicazioni quelli che estenderanno la classe per realizzare sottoclassi I primi useranno i membri public; i secondi anche i membri protected Le interfacce public e protected vanno progettate con cura 28/12/2001 package 13 DUE TIPI DI UTENTI class a { private int i; private void m( ) {…} int j; void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…} ESTENDE USA package pac interfaccia 28/12/2001 interfaccia package 14 Package: riassunto I package: permettono di creare gruppi di classi e interfacce fra loro in relazione definiscono uno spazio di nomi locale per classi e interfacce evitando conflitti con classi e interfacce di altri package permettono di avere classi, interfacce e membri (campi e metodi) non visibili all’esterno del package possono essere organizzati gerarchicamente 28/12/2001 package 15 Interfacce Un’interfaccia è un insieme di definizioni di metodi (senza implementazione) e (eventualmente) di dichiarazioni di costanti Definizione di una interfaccia: <modificatore di visibilita> interface <nome interfaccia> { corpo dell’interfaccia } 28/12/2001 package 16 Interfacce < modificatore di visibilita>, se specificato, deve valere public; se non specificato, è implicitamente package Esempio: public interface MiaInterfaccia { int UNA_COSTANTE_INTERA = 100; String UNA_COSTANTE_STRINGA = "ciao"; void metodo1(int a); char metodo2(String s, long l); } I metodi definiti (dichiarati) in una interfaccia sono implicitamente astratti (non essendone fornita l’implementazione) e pubblici; non sono ammessi metodi dichiarati come static Gli “attributi” di un’interfaccia, invece, sono implicitamente static, final e pubblici 28/12/2001 package 17 Interfacce Una interface è una struttura sintattica dotata di nome, che racchiude la specifica della segnatura e del ReturnType dei metodi di una classe non ancora implementata Esempio: interface Driveable { boolean startEngine(); void stopEngine(); float accelerate(float acc); boolean turn(Direction dir); } 28/12/2001 package 18 Implementazione di una interfaccia Una interfaccia può essere implementata da una (o più) classi: interface Driveable { boolean startEngine(); ... } class Automobile implements Driveable { boolean startEngine() { ... } // una particolare implementazione …. } class Motorcycle implements Driveable { boolean startEngine() { ... } // un’altra implementazione …. } Una classe che implementi una o più interfacce deve implementare tutti i metodi di quelle interfacce 28/12/2001 package 19 Interfacce In realtà, un’interfaccia rappresenta un contratto: “chi” si impegna ad implementarla si impegna a mettere a disposizione certe funzionalità Le interfacce non servono solo per “simulare” l’eredità multipla: definiscono un contratto in forma puramente astratta Le interfacce possono ereditare da altre interfacce, anche da più di una contemporaneamente (quindi tra interfacce è ammessa l’eredità multipla) 28/12/2001 package 20 Polimorfismo A un metodo che richieda un parametro di un certo tipo classe MiaClasse possiamo passare un oggetto il cui tipo è una sottoclasse di MiaClasse. Ciò rientra nel concetto generale di polimorfismo: data una classe MiaClasse e dichiarata una variabile mc di quel tipo, a mc può essere assegnato un qualunque oggetto che sia istanza di una qualunque sottoclasse (diretta o indiretta) di MiaClasse; non vale il contrario 28/12/2001 package 21 Polimorfismo: esempio class MiaClasse { ...... } class MiaClasseErede extends MiaClasse { ...... } class AltraMiaClasse { MiaClasse mc; public void unMetodo() { MiaClasseErede mce = new MiaClasseErede(); mc = mce; // lecito mce = mc; // errore ! mce = (MiaClasseErede)mc; // lecito } } 28/12/2001 package 22 Polimorfismo Esempio: Driveable vehicle; /* variabile di tipo interfaccia; le possiamo assegnare qualunque oggetto di una classe che implementa l’interfaccia */ Automobile auto = new Automobile(); Motorcycle moto = new Motorcycle(); ... vehicle = auto; vehicle.startEngine(); /* polimorfismo: è il metodo di Automobile */ … vehicle = moto; vehicle.startEngine(); /* polimorfismo: è il metodo di Motorcycle */ 28/12/2001 package 23 Ereditarietà multipla Una classe può implementare più di una interfaccia interface Driveable { void startEngine(); void stopEngine(); float accelerate(float acc); boolean turn(Direction dir); } interface Rentable { void startRental(); void endRental(); int book(Date start, Date end); } class AvisCar implements Driveable, Rentable { void startEngine() { … } void startRental() { … } … } 28/12/2001 package 24 Il modificatore abstract Una classe è dichiarata abstract quando contiene almeno un metodo abstract (cioè senza body) Una classe abstract non può essere instanziata: occorre sovrascrivere tutti i metodi abstract in una sottoclasse, e istanziare la sottoclasse Esempio: abstract class a { … abstract int m(int k); } class b extends a { ... int m(int n) { … } } 28/12/2001 package sovrascrive, fornendo la implementazione del metodo 25 INTERFACCE vs CLASSI abstract Le interfacce sono simili a classi che abbiano soltanto: metodi abstract campi static e final (cioè costanti) A differenza delle classi, le interfacce permettono di realizzare una forma di ereditarietà multipla 28/12/2001 package 26 Ma sono veramente necessarie le interfacce? Non si potrebbero usare le classi astratte al loro posto ? In realtà, le interfacce sono molto diverse dalle classi astratte: le interfacce ci forniscono una forma di eredità multipla le classi astratte possono (se “lo vogliono”) implementare loro metodi e fissare livelli di accesso sui loro membri, mentre le interfacce possono solo dichiarare costanti pubbliche e metodi pubblici (senza mai fornirne l’implementazione) In genere, se non c’è necessità di eredità multipla si preferisce usare le classi astratte ... possono implementare dei metodi, i quali, essendo ereditati dalle sottoclassi, non devono essere riscritti In genere, comunque, una classe che si prevede sarà utilizzata (ereditata) da molte altre classi dovrebbe essere l’implementazione di una interfaccia ... per il “solito” motivo: una classe può ereditare da una sola classe alla volta ... 28/12/2001 package 27 Unità di compilazione: riassunto file: MyClass.java package ll.myutil; /* import java.util.* ; public class MyClass { … } class MyOtherClass { … } interface MyInterface { … } 28/12/2001 package opzionale */ /* opzionale */ /* opzionale */ /* opzionale */ 28