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