Java 01

1,119 views

Published on

Introduzione a Java

Published in: Technology
1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total views
1,119
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
59
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

Java 01

  1. 1. Java Programmazione ad oggetti Davide Ficano [email_address]
  2. 2. Di cosa parleremo <ul><li>Differenze tra programmazione strutturata e programmazione ad oggetti </li></ul><ul><li>Concetti fondamentali della OOP ( O bject O riented P rogramming)‏ </li></ul><ul><li>Classi ed istanze </li></ul><ul><li>La OOP ed i costrutti Java </li></ul>
  3. 3. Caratteristiche della Programmazione strutturata /1 <ul><li>La Programmazione strutturata si basa su alcuni basilari principi </li></ul><ul><ul><li>Esistono le variabili locali e globali (strutture dati)‏ </li></ul></ul><ul><ul><li>Esiste il concetto di blocco di istruzioni (funzione e/o procedura) che esegue un compito preciso utilizzando le variabili locali e/o globali </li></ul></ul><ul><ul><li>le variabili contengono i dati su cui il programma agisce </li></ul></ul><ul><ul><li>Le funzioni rappresentano la logica (algoritmo) da applicare sui dati per ottenere un risultato </li></ul></ul><ul><ul><li>I dati e le funzioni sono disaccoppiati nel senso che una funzione non possiede l'accesso esclusivo ad un dato </li></ul></ul>
  4. 4. Caratteristiche della Programmazione strutturata /2 <ul><li>Il celebre libro di Niklaus Wirth palesa come nella programmazione strutturata la somma di Algoritmi e Strutture Dati produca i programmi </li></ul><ul><li>Nella OOP la separazione tra Algoritmi e Strutture Dati sparisce (o quasi). </li></ul><ul><li>Questa è una delle più significative differenze tra i due paradigmi di programmazione </li></ul>
  5. 5. Concetti generali della OOP <ul><li>Cosa è un oggetto </li></ul><ul><li>Incapsulamento (information hiding)‏ </li></ul><ul><li>Ereditarietà </li></ul><ul><li>Polimorfismo </li></ul>
  6. 6. Cosa è un oggetto <ul><li>Un oggetto è una entità software dotata di </li></ul><ul><ul><li>Stato </li></ul></ul><ul><ul><li>Comportamento </li></ul></ul><ul><li>Pensiamo all'entità software Animale, un animale può mangiare e muoversi, ha un nome e può essere affamato </li></ul><ul><li>In genere </li></ul><ul><ul><li>i verbi indicano comportamento (muoversi, mangiare)‏ </li></ul></ul><ul><ul><li>i sostantivi (nomi) indicano lo stato (nome,età)‏ </li></ul></ul><ul><li>questa regola non e' perfetta ma è abbastanza precisa </li></ul>
  7. 7. Definiamo una entità Oggetto Animale <ul><li>Stato </li></ul><ul><ul><li>Nome </li></ul></ul><ul><ul><li>Fame </li></ul></ul><ul><ul><li>Colore </li></ul></ul><ul><li>Comportamento </li></ul><ul><ul><li>Mangiare </li></ul></ul><ul><ul><li>Muoversi </li></ul></ul><ul><ul><li>Parlare (nel senso di emettere suoni)‏ </li></ul></ul>
  8. 8. Fido e Polly Stato e Comportamento Animale fido = new Cane(“Fido”); fido.muovi(); fido.parla(); // baubau // Verifico lo stato fido.getNome(); // Fido fido.getFame(); // poca fido.muovi(); fido.getFame(); // molta polly = new Pappagallo(“Polly”); polly.muovi(); // si muove sul trespolo non vola! polly.parla(); // mi chiamo pooolly // Verifico lo stato polly.getNome(); // Polly
  9. 9. Come sono legati stato e comportamento? Animale fido.muovi(); // Verifico lo stato fido.getFame(); // poca polly.muovi(); // Verifico lo stato polly.getFame(); <ul><li>L'algoritmo presente in muovi agisce sullo stato fame cambiando i valori di alcune variabili (strutture dati) contenute negli oggetti </li></ul><ul><li>Non sappiamo nulla su come funziona l'algoritmo che probabilmente è diverso per ogni animale </li></ul><ul><li>Riepilogando si può dire che nella OOP in generale </li></ul><ul><li>Lo stato cambia impostando i valori di variabili (es. fame = 100)‏ </li></ul><ul><li>Il comportamento lavora sulle variabili (es. incrementa il valore)‏ </li></ul>
  10. 10. Incapsulamento /1 <ul><li>La fame di Fido e Polly aumenta più velocemente se si muovono </li></ul><ul><li>Quando la fame è al massimo supponiamo che si rifiutino di muoversi </li></ul><ul><li>Richiamando il metodo mangia() Fido riprenderà a camminare. </li></ul><ul><li>Posso leggere lo stato “fame” con getFame() e cambiarlo con mangia(), non posso dare dei valori non previsti allo stato: </li></ul><ul><li>questo è </li></ul><ul><li>Incapsulamento o information hiding </li></ul>
  11. 11. Incapsulamento /2 <ul><li>L'information hiding </li></ul><ul><ul><li>nasconde i dettagli implementativi </li></ul></ul><ul><ul><li>impedisce di falsare lo stato dell'oggetto con dei valori non ammessi. I valori delle variabili possono essere cambiati solo dall'oggetto e non dall'esterno </li></ul></ul>
  12. 12. Ereditarietà /1 <ul><li>Sia Fido che Polly sono animali </li></ul><ul><li>Essi hanno in comune molte caratteristiche </li></ul><ul><ul><li>Nome (stato)‏ </li></ul></ul><ul><ul><li>Si muovono (comportamento)‏ </li></ul></ul><ul><li>Queste proprietà sono dell'entità Animale e le entità Cane e Pappagallo le ereditano </li></ul>
  13. 13. Ereditarietà /2
  14. 14. Ereditarietà /3 L'ereditarietà può essere modellata secondo diversi livelli di precisione
  15. 15. Ereditarietà /4 <ul><li>Ereditarietà significa avere un oggetto base con un insieme di stati e comportamenti presenti anche in oggetti derivati* </li></ul><ul><li>Si parla di gerarchia di oggetti quando un oggetto possiede dei discendenti che a loro volta ne hanno altri (si pensi all'albero genealogico)‏ </li></ul>* ereditare e derivare sono sinonimi in OOP
  16. 16. Ereditarietà /5 <ul><li>Se Fido e Polly sono uguali all'oggetto Animale che bisogno c'è di creare due nuovi oggetti Cane e Pappagallo? </li></ul><ul><li>Si sarebbe potuto scrivere qualcosa di più semplice </li></ul>fido = new Animale (&quot;Fido&quot;) invece di fido = new Cane (&quot;Fido&quot;)‏ polly = new Animale (&quot;Polly&quot;) invece di polly = new Pappagallo (&quot;Polly&quot;)‏ Gli oggetti hanno caratteristiche comuni ma non sono uguali!! Fido corre più velocemente di Polly Polly può volare ed anche il suono emesso è diverso Il comportamento cambia e questo si chiama Polimorfismo
  17. 17. Polimorfismo /1 <ul><li>Preso da Wikipedia, significa “assumere significati specifici in diversi contesti” </li></ul><ul><li>Nel mondo OOP significa “la capacita' di ridefinire il comportamento di un oggetto” </li></ul><ul><li>Sia Fido che Polly hanno un metodo “parla” ma il risultato è un pò diverso... </li></ul><ul><li>Il metodo parla è ereditato dall'entità Animale </li></ul>
  18. 18. Polimorfismo /2 <ul><li>Nel caso di Fido e Polly significa che il comportamento applicato, ad esempio, nel metodo muovi cambia negli oggetti Cane e Pappagallo </li></ul><ul><li>Comportamento = Algoritmo; quindi il metodo Cane.muovi() e Pappagallo.muovi() contengono codice diverso </li></ul>
  19. 19. Relazioni tra classi <ul><li>Le classi possono essere in relazione tra loro come </li></ul><ul><ul><li>Associazione (uso di oggetti)‏ </li></ul></ul><ul><ul><li>Aggregazione (contenimento di oggetti)‏ </li></ul></ul><ul><ul><li>Specializzazione (ereditarietà) </li></ul></ul>
  20. 20. Relazioni / Associazione <ul><li>Una classe si dice in associazione con un'altra quando esiste un legame debole o nullo </li></ul><ul><li>Supponiamo che esista una classe Collare, Fido potrebbe avere un attributo (field) di questo tipo. </li></ul><ul><li>Fido però può tranquillamente esistere senza collare (legame debole) quindi l'attributo collare della classe può essere vuoto </li></ul>
  21. 21. Relazioni / Aggregazione <ul><li>Una classe si dice in aggregazione con un'altra quando esiste un legame forte </li></ul><ul><li>Supponiamo che Fido abbia l'attributo età, questo attributo deve esistere ed avere un valore valido (legame forte)‏ </li></ul>La differenza tra Associazione e Aggregazione è molto sottile spesso ci si limita a dire che una classe ha un attributo di un'altra e questo attributo può essere null oppure valorizzato
  22. 22. Relazioni / Specializzazione <ul><li>Una classe si dice specializzazione di un'altra quando deriva da essa </li></ul><ul><li>Cane o Pappagallo sono specializzazioni di Animale </li></ul><ul><li>Animale è detta classe base </li></ul>
  23. 23. La fattoria degli animali in Java <ul><li>Tutti i concetti OOP trovano diretto riscontro nella sintassi del linguaggio Java </li></ul><ul><ul><li>Incapsulamento (Information hiding)‏ </li></ul></ul><ul><ul><li>Ereditarietà </li></ul></ul><ul><ul><li>Polimorfismo </li></ul></ul><ul><li>Prima di vedere questi aspetti prendiamo confidenza con la sintassi specifica di Java </li></ul>
  24. 24. Definire un oggetto in Java <ul><li>Java utilizza la parola riservata class per definire un oggetto </li></ul><ul><li>class è un contenitore di </li></ul><ul><li>variabili (che in java di chiamano field)‏ </li></ul><ul><li>funzioni (che in java si chiamano metodi)‏ </li></ul><ul><li>nome è una variabile </li></ul><ul><li>getNome e setNome sono due metodi </li></ul>class Animale { String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } }
  25. 25. Metodi con nomi &quot;speciali&quot; class Animale { String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } } <ul><li>Java usa una convenzione per i nomi dei metodi. Essendo una convenzione non è obbligatoria ma caldamente consigliata. </li></ul><ul><li>Tutti i metodi che restituiscono il valore di un field hanno il prefisso get </li></ul><ul><li>Tutti i metodi che impostano il valore di un field hanno il prefisso set </li></ul>
  26. 26. Getter e setter <ul><li>I getter e setter sono normali metodi, e' solo una convenzione &quot;umana&quot; quella </li></ul><ul><ul><li>di avere i getter che non prendono argomenti </li></ul></ul><ul><ul><li>di avere i setter che prendono un solo argomento </li></ul></ul><ul><li>Nulla vieta di avere un setter che non riceve nessun argomento oppure un getter che prende uno o piu' argomenti </li></ul>Un oggetto contenente getters e setters viene chiamato Java bean Si consiglia l'attenta lettura della naming convention http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
  27. 27. Istanze di oggetti <ul><li>Una volta definito il contenuto di una classe con field e metodi per utilizzarlo bisogna istanziarlo </li></ul><ul><li>Questo viene fatto con l'operatore new di Java che alloca in memoria un nuovo oggetto del tipo richiesto </li></ul>Animale fido = new Animale(); <ul><ul><li>Ne consegue che </li></ul></ul><ul><ul><ul><li>Una classe rappresenta la definizione di un oggetto </li></ul></ul></ul><ul><ul><ul><li>Una istanza è la sua struttura in memoria sulla quale è possibile cambiare il valore dei field </li></ul></ul></ul>
  28. 28. Istanze e costruttori <ul><li>Quando si crea un nuovo oggetto, ovvero una istanza, si richiama uno speciale metodo chiamato costruttore </li></ul><ul><li>Il costruttore ha lo stesso nome della classe e non ritorna niente </li></ul><ul><li>Possono esserci più costruttori per una classe a patto che prendano parametri diversi </li></ul><ul><li>Se non viene dichiarato nessun costruttore Java ne crea uno automaticamente che azzera tutti i field e non riceve argomenti </li></ul><ul><ul><li>Si chiama costruttore di default </li></ul></ul>
  29. 29. Esempi di costruttori public class Animale { } public class Animale { public Animale() { } } Le classi sono identiche, quella a destra viene generata in fase di compilazione da Java. Attenzione! Non viene modificato il sorgente ma è la classe compilata che in assenza di un costruttore viene creata con quello di default public class Animale { public Animale() { } public Animale(String nome) { } public Animale(String nome) { } } public class Animale { public Animale() { } public Animale(String nome) { } public Animale(String nome, String razza) { } }
  30. 30. Information Hiding e violazione <ul><li>Il contenuto della variabile 'nome' può essere cambiato facilmente senza nessun controllo </li></ul>public class ProvaAnimaleSenzaInformationHiding { public static void main(String[] args) { Animale fido = new Animale(); fido. nome = &quot;aaa&quot; ; } } <ul><li>Questa è una violazione dell'IH </li></ul><ul><li>Non abbiamo adeguatamente nascosto la variabile da modifiche arbitrarie </li></ul>
  31. 31. Java ed i livelli di Information Hiding (IH)‏ <ul><li>In Java è possibile scegliere chi deve vedere cosa . </li></ul><ul><li>I field ed i metodi possono avere differenti livelli di IH </li></ul><ul><li>Esistono tre livelli di IH </li></ul><ul><ul><li>public tutti possono vedere e/o modificare il field e/o il metodo </li></ul></ul><ul><ul><li>protected solo le classi derivare possono vedere e/o modificare il field e/o il metodo </li></ul></ul><ul><ul><li>private solo la classe contenente il field e/o il metodo può accederci </li></ul></ul>Esiste un quarto livello, package, ma non è si utile ai nostri scopi
  32. 32. Diminuiamo la visibilità class Animale { String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } } class Animale { private String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } } Cosa cambia Con questa piccola modifica la classe xxx non compila più. Abbiamo impedito modifiche dirette al field 'nome' Anche protected avrebbe nascosto la visibilità. Domanda: Cosa avrebbe fatto invece public ? Domanda: Come faccio a cambiare il nome adesso?
  33. 33. Best practices per l'information hiding <ul><li>E' pratica diffusa e altamente consigliabile </li></ul><ul><ul><li>definire i field sempre private </li></ul></ul><ul><ul><li>definire i metodi che devono restituire o impostare lo stato di un field public </li></ul></ul><ul><ul><li>definire i metodi che non aggiungono significato all'oggetto come protected o private (ad esempio un metodo che controlla la validità del field 'nome')‏ </li></ul></ul>
  34. 34. Overloading <ul><li>Abbiamo visto che una classe può avere più di un costruttore, purchè gli argomenti differiscano per numero oppure per tipo </li></ul><ul><li>Questa caratteristica si chiama Overloading </li></ul><ul><li>Tutti i metodi, non soltanto i costruttori, possono fare overloading </li></ul>public class Animale { public void muovi() { } public void muovi(double centimetri) { } }
  35. 35. Esercizi – cosa sapere <ul><li>Cosa sapere per svolgere gli esercizi </li></ul><ul><ul><li>Per stampare a video una stringa System.out.println(&quot;hello&quot;); </li></ul></ul><ul><ul><li>Se ad una stringa non viene assegnato nessun valore, viene impostata a null (null e' una parola riservata Java)‏ </li></ul></ul><ul><ul><li>Per avviare una classe inserire il metodo main </li></ul></ul>public static void main(String[] args) { }
  36. 36. Esempio <ul><li>Scrivere la classe Animale contenente il metodo getNome()‏ </li></ul><ul><li>Scrivere la classe TestAnimale con il metodo main che stampa il nome di una istanza Animale </li></ul>public class Animale { public String getNome() { return &quot;Polly&quot; ; } } public class TestAnimale { public static void main(String[] args) { Animale animale = new Animale(); System. out .println(animale.getNome()); } }
  37. 37. Esercizio 1 <ul><li>Definire una classe Gatto il cui costruttore prende un nome </li></ul><ul><li>Definire una classe Canarino il cui costruttore prende un nome </li></ul><ul><li>Definire una classe Fattoria che memorizza il gatto ed il canarino </li></ul><ul><ul><li>ha un metodo stampaNomiAnimali che stampa tutti I nomi degli abitanti della fattoria </li></ul></ul><ul><li>Definire una classe TestFattoria (con il main) che </li></ul><ul><ul><li>Istanzia un gatto di nome &quot;Silvestro&quot; ed un un canarino di nome &quot;Titti&quot; </li></ul></ul><ul><ul><li>istanzia una fattoria </li></ul></ul><ul><ul><li>Inserisce il gatto ed il canarino nella fattoria </li></ul></ul><ul><ul><li>Richiama il metodo stampaNomiAnimali </li></ul></ul><ul><li>Usare getters, setters e l'information hiding </li></ul>
  38. 38. Classi Gatto e Canarino public class Gatto { private String nome ; public Gatto(String nome) { this . nome = nome; } public String getNome() { return nome ; } } public class Canarino { private String nome ; public Canarino(String nome) { this . nome = nome; } public String getNome() { return nome ; } }
  39. 39. Classe Fattoria public class Fattoria { private Gatto gatto ; private Canarino canarino ; public Gatto getGatto() { return gatto ; } public void setGatto(Gatto gatto) { this . gatto = gatto; } public Canarino getCanarino() { return canarino ; } public void setCanarino(Canarino canarino) { this . canarino = canarino; } public void stampaNomiAnimali() { System. out .println( gatto .getNome()); System. out .println( canarino .getNome()); } }
  40. 40. Classe testFattoria public class TestFattoria { public static void main(String[] args) { Gatto gatto = new Gatto( &quot;Silvestro&quot; ); Canarino canarino = new Canarino( &quot;Titti&quot; ); Fattoria fattoria = new Fattoria(); fattoria.setGatto(gatto); fattoria.setCanarino(canarino); fattoria.stampaNomiAnimali(); } }

×