Introduzione alla programmazione con linguaggio Java ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dott. Dott.ssa Emma Calabresu, Calabresu, Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: Introduzione 2: Sintassi Java 3: Oggetti e Classi 4: Features 5: Eccezioni 6: GUI 7: Extra ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 4 Features ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • • Static e final Public, private protect Classi astratte Interfacce Wrapper ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili d’istanza Programmazione Java SDK 2.0 ©2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili d’istanza Variabili d’istanza Ogni oggetto ha la sua copia delle variabili d’istanza. Ciò significa che ogni istanza di una classe avrà in memoria un suo spazio riservato per le sue variabili class ExUsoRettangolo Rettangolo r1 = new Rettangolo(); Rettangolo r2 = new Rettangolo(); r1 class ExUsoRettangolo double double double double base; altezza; area(); perimetro () ; golo() Rettan w e n 1 = golo r Rettan Rettang olo r2 = new R ettango lo(); Base = 4.1; Altezza = 3.0; r2 Base = 5.5; Altezza = 1.7; ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili d’istanza Una volta definita una classe Rettangolo, si possono creare oggetti di tipo Rettangolo e accedere alle loro variabili e ai loro metodi: r1.base = 4.1; r1.altezza = 3.0; System.out.println(r1.area()); r2.base = 5.5; r2.base = 1.7; Fissa i valori Fissa i valori Si Si veda: veda: ExUsoRettangolo.java ExUsoRettangolo.java ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili statiche Variabili dichiarate con la parola static sono condivise da tutte le istanze di una classe esistenti nello stesso programma. Se si cambia il valore di una variabile statica in un'istanza, essa viene modificata in tutte le altre istanze. Questo è un po' pericoloso... ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili static e final Spesso le veriabili static sono dichiarate anche final, cioè “non modificabili” Convenzione: le variabili “final” sono scritte tutte maiuscole. Sono quasi sempre pubbliche: Static double gravity = 9.8; Static final double PI_GRECO = 3.1415925; ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili static e final Si Si veda: veda: Rettangolo2.java Rettangolo2.java ExUsoRettangolo2.java ExUsoRettangolo2.java class Rettangolo double base; double altezza; Static double sqrt2 = 1.414; class Geometria Rettangolo rett1; Rettangolo rett2; rett1 double base = 4.1; double altezzaa = 3.0; Static double sqrt2 = 1.414; rett2 double base = 5.5; double altezzaa = 1.7; Static double sqrt2 = 1.414; ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili Una classe può limitare l’accesso alle sue variabili con alcune parole chiave: – – – – Public – accessibile a chiunque all’esterno Private – inaccessibile a chiunque all’esterno Protect – (vedremo in seguito il significato) Nessuna parola chiave – (vedremo in seguito il significato) ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili tramite metodi • Spesso le variabili d'istanza sono private, e si accede ad esse mediante due tipi di metodi, noti come “set” e “get” • I metodi “set” servono per fissare il valore di una variabile d'istanza in un oggetto qualsiasi, i metodi “get” servono per ispezionarne il valore ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili tramite metodi Per ogni variabile d’istanza come, per esempio: private int pippo; Si scrivono, nella classe, i metodi: void setPippo (int newPippo) { pippo = newPippo; } int getPippo () { return pippo; } ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili tramite metodi Per esempio, per la classe Rettangolo: private int base; Si scrivono, nella classe, i metodi: void setBase (double b) { base = b; } Double getBase () { return base; } Si Si veda: veda: Rettangolo3.java Rettangolo3.java ExUsoRettangolo3.java ExUsoRettangolo3.java ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili locali Ogni variabile ha il suo “scope”, cioè il blocco di codice entro il quale essa è accessibile e che determina quando la variabile è creata o distrutta ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili locali La posizione della dichiarazione della variabile dentro il codice ne stabilisce lo scope e la pone in una delle quattro categorie: – – – – Variabile d’istanza Variabile locale Parametro di un metodo Parametro di una “exception-handler” ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili locali class MyClass Memeber Variabile Scope { … dichiarazione variabile di membro … public void aMethod (method parameters) Method Variabile Scope { … dichiarazione variabile locale … Catch (exception handler parametres) Local Variabile Scope { … } … Exception-hander Parameter Scope } … } ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } “shadowing” di variabili Se una variabile d'istanza e una variabile locale (interna ad un metodo o parametro di un metodo) hanno lo stesso nome, la variabile locale nasconde o “ombreggia” il nome della variabile d'istanza. class Rettangolo { double base; double altezza; … … Void setAltezza(double aa) { double altezza = aa; } Viene assegnato il valore “aa” ad una variabile locale! } ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } “shadowing” di variabili class Rettangolo { double base; double altezza; … … Void setAltezza(double altezza) { altezza = 2; } Viene assegnato il valore “altezza” al paramtro del metodo! } ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi astratti Si può dichiarare un metodo abstract e darne solo la “signature”, senza il corpo. Ad esempio: public abstract void aMethod (String s); In questo modo si indica il prototipo del metodo, ma non lo si realizza ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi astratte Ogni classe che contenga uno o più metodi astratti deve essere dichiarata abstract anch’essa Ad esempio: public abstract class aClass { … abstract void aMethod (String s); } Una classe astratta NON può essere istanziata! ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi astratte Una classe astratta può contenere metodi non astratti; tuttavia non può essere istanziata Per usarla, bisogna creare sottoclassi che implementino i metodi astratti, cioè diano ad essi un corpo Finchè, col “subclassing”, non sono stati implementati tutti i metodi astratti, anche le sottoclassi sono astratte e non possono essere istanziate ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi astratte Le classi astratte sono utilissime! Forniscono una struttura alle classi che riempiranno i metodi. Es.: la classe java.io.InputStream ha un metodo astratto: public abstract int read(); Le sue sottoclassi implementano read() a modo loro, leggendo in modo diverso dalle sorgenti. Il resto della classe ImputStream, d’altra parte, fornisce funzionalità basate sul metodo read(). Ogni sottoclasse di ImputStream eredita queste funzionalità e implementa read(). ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Interfacce Sono classi contenenti SOLO metodi astratti: sono il caso estremo delle classi astratte Si costruiscono come segue: public interface MyInterface { abstract double method1 (String s); abstract void method2 (int k); } ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Interfacce Le interfacce si utilizzano in modo diverso delle classi astratte: ogni classe che voglia implementare uno o più metodi di un’interfaccia deve dichiararlo nel modo seguente: class MyClass implements MyInterface { … } Se una classe non implementa tutti i metodi astratti di un’interfaccia, deve essere dichiarata abstract, e non può essere istanziata. ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Interfacce • Le interfacce sono uno strumento potentissimo nella programmazione object oriented. Definiscono un minimo standard di comportamento cui una classe deve attenersi per eseguire certi compiuti. • Sono come classi: si possono dichiarare variabili il cui tipo sia un’interfaccia, e i metodi possono accettare in input e restituire variabili di questo tipo. Ciò è molto importante: significa che oggetti di qualunque classe implementi quella interfaccia vanno bene. • Massimizzano la riutilizzabilità dei codici … ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Interfacce Esempi che mostrano come le interfacce massimizzino la riutilizzabilità di un codice, localizzando in pochi punti le modifiche necessarie per la riutilizzazione. ExInterfaccia1.java, ObjReusable.java, IPersona.java e ILibro.java ExInterfaccia2.java, ObjFactory.java, ObjReusable.java e ILibro.java ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Wrapper class ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Conclusioni Abbiamo visto: • Cosa sono le classi astratte e come possono essere utilizzate • Le interfacce, uno strumento programmazione object oriented potente ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } della Ereditarietà Richiami e suggerimenti Importante: • Comprendere bene la potenza delle interfacce per lo sviluppo di programmi object oriented ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba }