Files jar quando un’applicazione JAVA è composta da molte classi, è possibile raggruppare i files .class in un archivio compresso di estensione .jar (JAVA archive)Æ è possibile distribuire librerie di classi all’interno di cartelle il formato .jar è equivalente al .zip Æ l’unica differenza è che in ogni archivio jar è presente un file chiamato MANIFEST.MF che contiene informazioni sul contenuto/proprietà dell’archivio Telematica II 6. Ereditarieta’/Polimorfismo in JAVA il file MANIFEST è un file di testo composto da coppie attributovalore, ad esempio: Manifest-version: 1.0 Created by: Eclipse IDE per creare un archivio si usa il comando jar (si potrebbe in teoria usare anche WinZip): jar cvmf MANIFEST.MF archivio.jar input-files oppure jar cvf libreria.jar Cartella Corso di Laurea in Ingegneria Informatica A.A. 2009-2010 2° Semestre Prof. Giovanni Pascoschi 2 Files jar Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Utilizzo file jar per utilizzare da una applicazione classi contenute in un file jar non posizionata nella stessa cartella si potrebbe usare: java –cp .;C:\cartella\libreria.jar mypackage.ClasseConMain in alternativa si puo’ posizionare la libreria .jar nella cartella jre\lib\ext del JDK per rendere eseguibile un file .jar è sufficiente inserire nel file MANIFEST una riga che contiene la classe con il metodo main() che sarà eseguito automaticamente dalla JVM : Manifest-version: 1.0 Created by: Eclipse IDE Main-class: ServerMain 3 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 4 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Ereditarietà Classi derivate public class Persona { L’ereditarietà nasce dal bisogno di creare classi piu’ specifiche a partire da altre piu’ generali private String nome; La classe Persona è detta superclasse (o classe base) private String cognome; private int annoDiNascita; si dice che la nuova classe generata (chiamata derivata) eredita attributi e metodi dalla classe base public void registra (String, String); } public class Dipendente extends Persona { esempio : classe base = personaÆ classe derivata = dipendente private int matricola; La classe DIpendente, che eredita i membri della superclasse, è detta sottoclasse (o classe derivata). private String professione; sintassi: private void assegna (int, String); } class derivata extends base 5 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 6 Classi derivate Telematica II – A.A. 2009-2010 Classi derivate : gerarchia delle classi Figura_geom Persona nome cognome anno_nascita Registra Dipendente a cura di Pascoschi Giovanni Le classi sono rappresentate con un rettangolo e la derivazione è rappresentata con una freccia dalla sottoclasse alla superclasse. Poligono la freccia si legge “is a” (e’ un) matricola professione Quadrato Pentagono Esagono Assegna 7 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 8 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Classe Object Classe derivate : costruttori la libreria standard JAVA soddisfa la teoria degli oggetti Æ esiste una classe Object che astrae il concetto di oggetto generico public class Persona { private String nome; private String cognome; private int annoDiNascita; Object appartiene al package java.lang Æ Object è la superclasse di ogni classe Quando si invoca il costruttore della sottoclasse viene eseguita prima la lista di inizializzazione, e dopo il costruttore della sottoclasse. Persona(String n, String c, int a) { nome = n; cognome = c; annoDiNascita = a; } } se definiamo una classe che non estende nessun’altra classe, essa estende automaticamente Object public class Dipendente extends Persona { private int matricola; private String professione; public class persona { ...... } Dipendente(String n, String c, int a, int m, String p) { super(n, c, a); // a causa degli attributi privati della superclasse matricola = m; professione = p; equivale a public class persona extends Object { } } ...... } 9 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 10 Classe derivate : costruttori Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Classe derivate : protected public class Persona { private String nome; public class Persona { protected String nome; protected String cognome; protected int anno_nascita; private String cognome; private int annoDiNascita; Persona( ) { // costruttore di default nome = ""; cognome = ""; annoDiNascita = 0; } Il costruttore della sottoclasse non invoca il costruttore della superclasse Æ l’esecuzione del costruttore della classe derivata richiama il costruttore di default e quindi si richiama il costruttore della sottoclasse public void registra (String, String); Persona(string n, String c, int a) { nome = n; cognome = c; annoDiNascita = a; } Per rendere i campi privati accessibili anche alle sottoclassi a livello di package è necessario fare uso del qualificatore d’accesso “protected” nella classe base }; public class Dipendente extends Persona { }; private int matricola; public class Dipendente extends Persona { private int matricola; private String professione; I campi protected sono accessibili dalle classi derivate, ma inaccessibili dall’esterno. private String professione; public void assegna (int, String); Dipendente(String n, String c, int a, int m, String p) { matricola = m; professione = p; } }; }; 11 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 12 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Eredità multipla in C++ Polimorfismo Figura_geom Parallelepipedo Quadrato Il polimorfismo è la proprietà in base alla quale oggetti differenti possono rispondere in maniera diversa ad uno stesso messaggio il polimorfismo è utile se associato al concetto di ereditarietà : una classe derivata puo’ ereditare un metodo da una classe base, ma puo’ cambiarne il meccanismo di interfaccia Poligono Pentagono Esagono La classe derivata Quadrato deriva da due classi : Parallelepipedo e Poligono l’eredità multipla esiste in C++ ma non in JAVA a causa alcune volte di problemi implementativi (non si puo’ usare extends con piu’ classi) 13 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 14 Polimorfismo : overloading & overriding Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Polimorfismo : overloading - esempio overloading (sovraccarico) dei metodi Æ quando il nome del metodo nella classe derivata è uguale e il numero o il tipo dei parametri (firma) passati al metodo cambia public class Persona { protected String nome; protected String cognome; overriding (sovrapposizione) dei metodi Æ quando il nome del metodo nella classe derivata è uguale e la firma non cambia protected int annoDiNascita; public void registra (String, String, int); } public class Dipendente extends Persona { private int matricola; private String professione; public void registra (String, String, int, int, String); } 15 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 16 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Polimorfismo : overriding - esempio Polimorfismo : overriding - esempio si supponga di avere le seguenti classi Cerchio, Triangolo, Rettangolo tutte derivate dalla classe Figura sia dato un array figure[ ] di oggetti delle suddette classi ciascuna di esse ha un metodo draw( ) (overriding), ciascuna con la propria implementazione si supponga di voler disegnare tutte le figure contenute nel suddetto array public class Persona { protected String nome; protected String cognome; protected int annoDiNascita; Figura[ ] figure = new Figura[3]; public void registra (String, String, int); figure[0] = new Cerchio( ); }; figure[1] = new Triangolo( ); public class Dipendente extends Persona { figure[2] = new Rettangolo( ); private int matricola; private String professione; for(int i=0; i<figure.lentgh; i++) public void registra (String, String, int); figure[i].draw( ); possiamo semplicemente richiamare il metodo draw( ) della superclasse Figura, lasciando al programma, a run-time, il compito di stabilire quale metodo draw( ) richiamare in base al tipo dell’oggetto public void registra1 (int, String) }; 17 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 18 Ereditarietà e Polimorfismo : vantaggi a cura di Pascoschi Giovanni Metodi astratti / Classi astratte riutilizzo di classi già implementate aggiungendo / modificando solo gli attributi / metodi che necessitano per risolvere il problema riduzione del codice sorgente ridondante grazie al riutilizzo di classi già preesistenti alle quali si apportano le necessarie modifiche public abstract void prepara( ); un metodo astratto non implementa un proprio blocco di codice Æ è come se fosse un segnaposto specializzazione di classi derivate Æ si aumenta l’efficienza delle sottoclassi mantenendo un alto grado di flessibilità nella gestione in maniera omogenea di oggetti appartenenti alla superclasse o alle classi derivate (modificando opportunamente i metodi) gestione delle gerarchi delle classi Æ è possibile gestire insiemi di classi altamente strutturate che si possono estendere tramite semplici relazioni di ereditarietà public abstract class Esempio { public abstract void prepara( ); // non ha la coppia di parentesi graffe .... }; una classe astratta deve necessariamente essere estesa con un overriding del metodo astratto il polimorfismo permette di gestire insieme di oggetti simili ma rappresentati da strutture di dati diverse (p.e. poligoniÆrettangoliÆquadratiÆcerchi, ecc) 19 Telematica II – A.A. 2009-2010 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 20 una classe è detta astratta quando contiene almeno un metodo astratto, e non puo’ essere istanziata. Cio’ puo’ capitare quando una superclasse non è in grado di specificare un particolare metodo, appunto perchè è una classe troppo generale (indefinita) Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Modificatore final 1. 2. 3. Interfacce l’interfaccia è un’evoluzione della classe astratta. Un’interfaccia permette di stabilire la forma di una classe : nome dei metodi, lista dei parametri e valori di ritorno, ma il corpo dei metodi deve essere vuoto un’interfaccia serve per stabilire un protocollo di comunicazione(modello) tra classi per creare un’interfaccia basta usare la keyword interface al posto di class (tutti gli attributi devono essere public static e final / i metodi devono essere public e abstract) la parola chiave final puo’ essere utilizzata in tre modi diversi: per creare una costante per impedire la ridefinizione di un metodo per impedire l’ereditarietà public class Esempio { final void metodo( ); // per impedire la ridefinizione di un metodo .... }; public interface Esempio { public static final UNO = 1; public abstract void stampa( ); .... }; public final class Esempio { void metodo( ); // per impedire l’ereditarietà di una classe .... }; 21 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni public class Prog implements Esempio { public void stampa( ) { System.out.println(“Ciao”); // per estendere un’interfaccia si usa implements } }; 22 Interfacce Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Interfacce c/o Classi astratte in JAVA l’ereditarietà multipla si riesce ad ottenere tramite le interfacce una classe astratta puo’ anche non contenere metodi astratti, o uno astratto e gli altri concreti un’interfaccia contiene per forza tutti metodi astratti public class Myappl extends Applet implements MouseListener, Runnable { .... }; si puo’ estendere solo una classe astratta alla volta (no ereditarietà multipla) si possono implementare piu’ interfacce contemporaneamente (si’ ereditarietà multipla) Un Applet JAVA per definizione estende la classe Applet (non puo’ estendere altre classi) Æ nell’esempio abbiamo la possibilità di gestire il mouse (MouseListener) e contemporaneamente il multi-thread (Runnable), implementando due classi interfacce la classe astratta è un’astrazione troppo generica per poter essere istanziata l’interfaccia è un’astrazione comportamentale (in via globale) che non ha senso istanziare nel contesto 23 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 24 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Gestione delle eccezioni Gestione delle eccezioni un’eccezione indica che si è verificato un evento non convenzionale (situazione imprevista) durante l’esecuzione di un proramma si racchiude in un blocco try il codice che puo’ lanciare eccezioni ci possono essere uno o piu’ blocchi catch, che specificano il tipo di eccezione che possono gestire e contengono il codice per gestirla il sistema di gestione delle eccezioni in JAVA è basato sull’assunzione che il metodo che si accorge dell’errore non è in grado di gestirlo, ma lancia (throw) un’eccezione ci puo’ essere un blocco finally che viene indipendentemente dal verificarsi dell’eccezione sempre eseguito, ci puo’ essere un’altra porzione di codice che cattura (caught) l’eccezione e la gestisce obiettivo Æ controllare la situazione di un applicativo anche quando si riscontrano situazioni anomale che potrebbero far uscire il programma stesso in maniera brutale 25 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 26 Esempio di gestione delle eccezioni Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esempio di gestione delle eccezioni ........ try { try { int c = a/b; } catch (ArithmeticException e) { System.out.println( “Divisione per zero”) ); } int c = a/b; } catch (ArithmeticException e) { System.out.println( “Divisione per zero”) ); } ........ se non ci fosse il try ... catch, e se b fosse uguale a 0, il programma terminerebbe in maniera brutale con il seguente messaggio: Exception in thread “main” java.Lang.ArithmeticException: / by zero at Eccl.main(Eccl.java:6) con il try ... catch, invece, il programma puo’ continuare l’esecuzione facendo comparire il messaggio: Divisione per zero se usiamo all’interno del catch l’istruzione: Exception in thread “main” Æ eccezione java.Lang.ArithmeticException Æ tipo di eccezione / by zero Æ messaggio descrittivo at Eccl.main Æmetodo in cui è avvenuta l’eccezione (Eccl.java:6) Æ file e riga in cui è stata lanciata l’eccezione 27 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni e.printStackTrace( ); compare lo stesso messaggio in assenza del blocco try....catch 28 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esempio di gestione delle eccezioni Esempio di gestione delle eccezioni try { try { int c = a/b; int c = a/b; } catch (Exception e) { e.printStackTrace( ); } } catch (NullPointerException e) { e.printStackTrace( ); } in questo esempio il tipo di eccezione non verrà mai catturato, perchè diverso dal tipo dichiarato nel catch NullPointerException != ArithmeticException 29 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni in questo esempio il tipo di eccezione verrà catturato, perchè Exception indica qualsiasi tipo di eccezione 30 Esempio di gestione delle eccezioni public int div (int a, int b) { int ExceptionNum = 0; try { int c = a/b; } catch (ArithmeticException e) { System.out.println( “Eccezione : “ + e.getClass ( ) ); System.out.println( “Errore : “ + e.getMessage ( ) ); ExceptionNum ++; } finally { if ExceptionNum ==0) System.out.println( “Nessuna eccezione sollevata” ); else System.out.println(“ Eccezioni sollevate : “ + ExceptionNum ); } return c; } int c = a/b; } catch (ArithmeticException e) { e.printStackTrace( ); } catch (Exception e) { e.printStackTrace( ); } finally { System.out.println(“operazione terminata” ); } in questo esempio ci sono piu’ blocchi catch e in seguito finally viene sempre eseguito sia con eccezione che senza Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esempio di gestione delle eccezioni try { 31 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 32 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Tipi di eccezioni piu’ frequenti Gestione delle eccezioni NullPointerException Ærichiamato metodo di un reference che punta a null Æ java.lang i tipi di eccezione si possono personalizzare public class DivideByZeroException extends AritmeticException { public DivideByZeroException( ) { super(“Tentativo di divisione per zero”); } }; ArrayIndexOutOfBoundsException Æ accessso ad un indice di un array troppo alto (fuori dell’allocazione) Æ java.lang FileNotFoundException, EOFException, ecc per gli stream Æ java.io ConnectionException per le connessioni Æ java.net per usare il nuovo tipo di eccezione si dovrà lanciarla manualmente tramite la parola chiave throw 33 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 34 Esempio di throw per implementare un’eccezione in un proprio metodo, si usa la keyword throw, seguita da un oggetto di una classe derivata da Throwable nell’esempio precedente, usare il throw tramite un semplice if sembra superfluo Æ è importante il meccanismo di propagazione dell’eccezione, che puo’ essere gestita ad un livello superiore (p.e. metodo della classe chiamante) }; public double quoziente(int numertore, int denominatore) throws DivideByZeroException quando un’eccezione viene lanciata, il controllo esce dal blocco try e passa alla prima clausola catch { if(denominatore==0) throw new DivideByZeroException( ); return (double) numeratore/denominatore; i metodi che possono lanciare eccezioni, devono dichiararlo esplicitamente nella loro signature, usando la keyword throws, seguita dalla classe di eccezione che possono lanciare } Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Propagazione delle eccezioni public class DivideByZeroException extends AritmeticException { public DivideByZeroException( ) { super(“Tentativo di divisione per zero”); // nuovo tipo di eccezione } 35 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 36 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Gestione delle eccezioni Introduzione agli Stream I/O JAVA la dichiarazione di throws accanto al metodo avverte il compilatore che durante l’esecuzione del metodo puo’ avvenire un’eccezione che verrà gestita in un’altra parte del codice (classe DivideByZeroException) l’I/O in JAVA è basato sul concetto di stream (flusso), che rappresenta una connessione ad una canale di comunicazione uno stream è quindi collegato ad un dispositivo fisico di I/O molti metodi della libreria standard JAVA sono dichiarati con throws esistono sia stream di input che di output per esempio le classi del package java.io hanno il throws IOException si possono usare anche diversi tipi di eccezione dopo la parola chiave throws, separati da virgole 37 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 38 Introduzione agli Stream I/O JAVA Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni JAVADOC sono FIFO : ciò che viene scritto da un OutputStream viene letto nello stesso ordine dal corrispondente InputStream JavaDoc nacque come strumento interno utilizzato dai ricercatori della Sun che stavano lavorando alla creazione del linguaggio Java e delle sue librerie sono ad accesso sequenziale: non è fornito alcun supporto per l'accesso casuale la grande mole di sorgenti fece pensare alla creazione di un tool per la generazione automatica di documentazione HTML sono read-only oppure write-only: uno stream consente di leggere (InputStream) o scrivere (OutputStream) ma non entrambe le cose. Se ambedue le funzioni sono richieste, ci vogliono 2 distinti stream: questo è un caso tipico delle connessioni di rete: da una connessione (socket) si ottengono due stream, uno in scrittura e uno in lettura la creazione e manutenzione di un gran numero di pagine web richiese l'aiuto di un sistema automatico per la gestione dei riferimenti incrociati fra classi e gli inevitabili errori di battitura sono bloccanti: la lettura blocca il programma che l'ha richiesta finché i dati non sono disponibili. Analogamente, la scrittura blocca il richiedente finché non è completata con le prime versioni si potevano inserire le descrizioni di ogni classe e dei suoi metodi, nonché il significato dei parametri e delle variabili membro JavaDoc nacque quindi per permettere ai programmatori di inserire dei frammenti HTML nei commenti (ignorati quindi dal compilatore) quasi tutti i loro metodi possono generare eccezioni 39 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 40 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni JAVADOC JAVADOC /** per produrre la documentazione in JavaDoc di un sorgente si utilizza il tool javadoc : * descrizione della classe * * @author autore * @version versione javadoc nomeFile.java */ public classDocTest { /** descrizione dell’attributo */ public int i; /** * descrizione del metodo * * @param nome_parametro descr * @return valore di ritorno */ public voidf(intp1) { } } 41 Telematica II – A.A. 2009-2010 che genererà in automatico un file in formato html oppure in Eclipse (ved. esercitazioni successive) a cura di Pascoschi Giovanni 42 Riepilogo della lezione Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Fine della lezione JAVA e OOP file jar Ereditarietà / Polimorfismo interfacce e classi astratte Gestione delle eccezioni Introduzione agli stream I/O JAVADOC 43 Telematica II – A.A. 2009-2010 Domande? a cura di Pascoschi Giovanni 44 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercizio n.6 Esercizio n.7 Nell’inventario di un’azienda sono presenti 50 automezzi con un determinato valore stimato. Utilizzare un array Inventario di oggetti della classe Automezzo. La classe ha come attributo privato Valore, mentre i metodi setValore e getValore permettono rispettivamente la scrittura e la lettura della sua variabile incapsulata. Implementare i seguenti metodi: 1. visualizzazione dell’automezzo con valore maggiore 2. ordinamento dell’array di oggetti in ordine crescente di valore Una scuola intende distinguere i propri diplomati tra quelli che hanno conseguito un diploma in sessantesimi e quelli che invece lo hanno conseguito in centesimi. Il programma di gestione dei diplomi, a disposizione della segreteria della scuola, deve distinguere i diplomati in sessantesimi in 2 fasce di voto (da 36 a 50 e da 51 a 60), mentre i diplomati in centesimi in tre fasce di voto (da 60 a 70, da 71 a 89 e da 90 a 100). Progettare una gerarchia di classi in cui la base è Diplomato mentre le classi derivate sono DiplomatoVecchioEsame e DiplomatoNuovoEsame (con relativi costruttori). Definire in particolare un metodo registra() che permette nella classe base di registrare con un flag lo studente nell’archivio. Definire quindi lo stesso metodo registra nelle classi derivate. Supponendo di avere 200 diplomati vecchio esame e 150 diplomati nuovo esame, implementare i seguenti metodi: 1)Valore medio del voto dei diplomati vecchio esame 2)Valore medio del voto dei diplomati nuovo esame 3)Analizzando i diplomati vecchio esame e nuovo esame, calcolare il numero totale di diplomati che hanno avuto un voto superiore o pari a 8 (su base decimale) per entrambi i tipi di diplomati 45 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 46 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni