Java Ereditarietà e Polimorfismo applicate in Java Davide Ficano [email_address]
Ereditarietà Polimorfismo <ul><li>Abbiamo detto che </li></ul><ul><ul><li>Ereditarietà significa avere un oggetto  base   ...
Gerarchia oggetto Animale
Classe Base Animale <ul><li>public   class  Animale { </li></ul><ul><li>private  String  nome ; </li></ul><ul><li>public  ...
Classe specializzata Cane &quot;extends&quot; Animale <ul><li>public   class  Cane  extends  Animale { </li></ul><ul><li>p...
Note su &quot;extends&quot; <ul><li>La parola riservata  extends  serve a derivare da una classe base </li></ul><ul><li>Si...
Costruttori ed ereditarietà Esempio 1 <ul><li>I costruttori </li></ul><ul><ul><li>non vengono ereditati </li></ul></ul><ul...
Utilizzo di super nei metodi /1 <ul><li>Anche i metodi possono richiamare  super  ma solo per riferirsi ad un metodo della...
Utilizzo di super nei metodi /2 <ul><li>E' utile usare super nei metodi quando si vuole richiamare il metodo con lo stesso...
L'oggetto  this <ul><li>Java possiede un oggetto che permette di fare riferimento all'istanza in cui ci si trova </li></ul...
Polimorfismo (ancora!) <ul><li>Abbiamo visto che </li></ul><ul><ul><li>il metodo  parla()  della classe Cane ha  un compor...
Incapsulamento e Polimorfismo /1 Esempio 2 <ul><li>E' molto utile utilizzare l'ereditarietà e l'incapsulamento insieme </l...
Incapsulamento e Polimorfismo /2 <ul><li>Quando l'animale si muove la fame aumenta </li></ul><ul><li>public   void  muovi(...
Incapsulamento e Polimorfismo /3 <ul><li>Il metodo  possoAncoraMuovermi()  è  public  perchè può essere utile al chiamante...
Incapsulamento e Polimorfismo /4 Facciamo muovere Fido <ul><li>public   class  TestCorsaFido { </li></ul><ul><li>public   ...
Incapsulamento e Polimorfismo /4 Il risultato della corsa di Fido <ul><li>Sono pieno 0 </li></ul><ul><li>Sono pieno 1 </li...
Incapsulamento e Polimorfismo /5 Esempio 3 <ul><li>La classe Cane riutilizza l'algoritmo della classe Animale per aumentar...
Incapsulamento e Polimorfismo /6 <ul><li>Fido diventa affamato più velocemente </li></ul><ul><ul><li>basta ridefinire cosa...
Incapsulamento e Polimorfismo /7 <ul><li>Senza modificare altro codice e rieseguendo il programma di test si ottiene </li>...
Incapsulamento e Polimorfismo /8 <ul><li>Il polimorfismo permette di trattare le classi derivate come se fossero tutte del...
Incapsulamento e Polimorfismo /9 <ul><li>Cosa succede se si vuole &quot;convertire&quot; un oggetto Animale generico in un...
Incapsulamento e Polimorfismo /10 Cast - da classe base a derivata <ul><li>Il cast si ottiene mettendo tra parentesi il ti...
Incapsulamento e Polimorfismo /11 operatore instanceof <ul><li>E' possibile testare un oggetto per scoprire il suo tipo ut...
Override dei metodi <ul><li>Quando si  ridefinisce  un metodo in una classe derivata si dice che si fa  override </li></ul...
Overload e override <ul><li>Overload – due o più metodi  della stessa classe  hanno lo stesso nome ma prendono argomenti d...
Classi e metodi astratte /1 Esempio 4 <ul><li>All'inizio abbiamo definito la classe Animale con il metodo  parla() </li></...
Classi e metodi astratti /2 <ul><li>Si crea una classe con il metodo parla  astratto </li></ul><ul><li>public   class  Ani...
In Java tutto è un oggetto Classe Object /1 <ul><li>In Java tutte le classi hanno una classe base  implicita </li></ul><ul...
In Java tutto e' un oggetto Classe Object /2 <ul><li>La classe Object e' detta la radice della gerarchia delle classi Java...
Polimorfismo per interfacce /1 <ul><li>Si è visto che in Java si può derivare da una sola classe </li></ul><ul><li>Può ess...
Polimorfismo per interfacce /2 <ul><li>Un pappagallo può volare ma un'anatra può sia volare che nuotare </li></ul><ul><li>...
Polimorfismo per interfacce /3 <ul><li>La classe PuoVolareENuotare è necessaria ma appesantisce inutilmente la gerarchia d...
Polimorfismo per interfacce /4
Polimorfismo per interfacce /4 <ul><li>Questo si realizza in Java utilizzando le interfacce (parola riservata  interface )...
Polimorfismo per interfacce /5 <ul><li>Le nostre classi diventano </li></ul>public   interface  PuoNuotare { public   bool...
Polimorfismo per interfacce /6 public   class  Cane  extends  Animale  implements  PuoNuotare { ... ... public   boolean  ...
Polimorfismo per interfacce /7 public   class  Anatra  extends  Animale  implements  PuoNuotare, PuoVolare { ... ... publi...
Quando si  devono usare le interfacce <ul><li>Sempre!!! </li></ul><ul><li>Le interfacce permettono di disaccoppiare l'impl...
I package /1 <ul><li>L'edizione Standard Edition di Java (SE) contiene circa 4000 tra classi ed interfacce </li></ul><ul><...
I package /2 <ul><li>I principali package in java sono </li></ul><ul><li>java.lang String, Integer, Long </li></ul><ul><li...
I package /3 <ul><li>Se si vuole usare un metodo o una classe di un package bisogna importarlo nel proprio programma </li>...
I package /4 <ul><li>package  corso.java; </li></ul><ul><li>import  java.io.File; </li></ul><ul><li>import  java.util.Date...
I package /5 <ul><li>Un proprio package si definire con la parola riservata  package </li></ul><ul><li>Un package puo' ave...
I package /6 <ul><li>Per utilizzare le classi di un package si deve fare l'import tramite la parola riservata import </li>...
Import singola classe Import intero package <ul><li>E' possibile effettuare l'import di una sola classe </li></ul>import  ...
Package e classi con nomi uguali /1 <ul><li>Java ha due classi Date </li></ul><ul><ul><li>una usata per un uso generale (j...
Package e classi con nomi uguali /2 <ul><li>Bisogna risolvere l'ambiguità in fase di dichiarazione della variabile </li></...
Upcoming SlideShare
Loading in …5
×

Java 02

1,410 views

Published on

Introduzione a Ereditarietà e Polimorfismo applicate in Java

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,410
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
63
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Java 02

  1. 1. Java Ereditarietà e Polimorfismo applicate in Java Davide Ficano [email_address]
  2. 2. Ereditarietà Polimorfismo <ul><li>Abbiamo detto che </li></ul><ul><ul><li>Ereditarietà significa avere un oggetto base con un insieme di stati e comportamenti presenti anche in oggetti derivati </li></ul></ul><ul><ul><li>Polimorfismo significa “assumere significati specifici in diversi contesti” </li></ul></ul>
  3. 3. Gerarchia oggetto Animale
  4. 4. Classe Base Animale <ul><li>public class Animale { </li></ul><ul><li>private String nome ; </li></ul><ul><li>public Animale(String nuovoNome) { </li></ul><ul><li>nome = nuovoNome; </li></ul><ul><li>} </li></ul><ul><li>public String getNome() { </li></ul><ul><li>return nome ; </li></ul><ul><li>} </li></ul><ul><li>public String parla() { </li></ul><ul><li>return &quot;Errore: Animale generico&quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>Non stiamo descrivendo nessuna specie animale particolare quindi non sappiamo qual'è il verso * Notare che non esiste il metodo setNome(...) per fare in modo che una volta dato il nome (nel costruttore) all'animale non lo si possa più cambiare
  5. 5. Classe specializzata Cane &quot;extends&quot; Animale <ul><li>public class Cane extends Animale { </li></ul><ul><li>public Cane(String nome) { super (nome); } </li></ul><ul><li>public String parla() { </li></ul><ul><li>return &quot;Ciao, io sono &quot; + getNome() + &quot; e faccio baubau&quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Viene usata la parola extends per derivare dalla classe Animale </li></ul><ul><li>Il costruttore richiama quello della classe base tramite la parola riservata super </li></ul><ul><li>Il metodo parla() viene ridefinito. Abbiamo applicato il Polimorfismo </li></ul><ul><li>Viene richiamato il metodo getNome della classe base </li></ul>
  6. 6. Note su &quot;extends&quot; <ul><li>La parola riservata extends serve a derivare da una classe base </li></ul><ul><li>Si può derivare solo da una classe </li></ul><ul><li>Avere l'ereditarietà singola evita le ambiguità dovute alla presenta dello stesso metodo in due classi base: quale chiamo? </li></ul>public class Cane extends Animale, Lassie { } La Sintassi è sbagliata perché extends accetta solo una classe
  7. 7. Costruttori ed ereditarietà Esempio 1 <ul><li>I costruttori </li></ul><ul><ul><li>non vengono ereditati </li></ul></ul><ul><ul><li>sono comunque accessibili tramite la sintassi super (...) </li></ul></ul>public class Cane extends Animale { ... ... } Non compila public class Cane extends Animale { public Cane(String nome) { super (nome); } } La classe a sinistra non compila perchè non &quot;vede&quot; il costruttore della classe base La classe a destra dichiara un costruttore uguale a quello della classe base e poi lo richiama con la sintassi super (...)
  8. 8. Utilizzo di super nei metodi /1 <ul><li>Anche i metodi possono richiamare super ma solo per riferirsi ad un metodo della classe base </li></ul><ul><ul><li>Significa che un metodo non può richiamare un costruttore tramite super </li></ul></ul><ul><li>public class Cane extends Animale { </li></ul><ul><li>public String parla() { </li></ul><ul><li>super ( &quot;fido&quot; ); </li></ul><ul><li>return ...; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Non compila, c'e' errore alla linea nr 3. </li></ul><ul><li>un costruttore non puo' essere richiamato in un metodo </li></ul>Domanda: Perché un costruttore non può essere richiamato in un metodo?
  9. 9. Utilizzo di super nei metodi /2 <ul><li>E' utile usare super nei metodi quando si vuole richiamare il metodo con lo stesso nome presente nella classe base </li></ul><ul><li>public class Cane extends Animale { </li></ul><ul><li>public String parla() { </li></ul><ul><li>return &quot;Ciao, io sono &quot; + super .parla() + &quot; e faccio baubau&quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Il metodo Cane.parla richiama il metodo Animale.parla </li></ul><ul><li>la sintassi super.nomeMetodo può essere usata in tutti i metodi ma risulta prolissa ed inutile ad eccezione del caso menzionato sopra </li></ul>
  10. 10. L'oggetto this <ul><li>Java possiede un oggetto che permette di fare riferimento all'istanza in cui ci si trova </li></ul><ul><li>Si usa per risolvere problemi di ambiguità sulle variabili </li></ul>public Animale(String nome) { this . nome = nome; } public class Fattoria { public void addAnimale(Animale animale) { animale.setFattoria( this ); } } <ul><li>Oppure per passare &quot;se stessi&quot; </li></ul>
  11. 11. Polimorfismo (ancora!) <ul><li>Abbiamo visto che </li></ul><ul><ul><li>il metodo parla() della classe Cane ha un comportamento diverso da quello della classe base, è un comportamento più specializzato </li></ul></ul><ul><ul><li>il metodo parla() può utilizzare quanto fatto nella classe base richiamando il metodo super.parla() </li></ul></ul><ul><li>public class Cane extends Animale { </li></ul><ul><li>public String parla() { </li></ul><ul><li>return &quot;Ciao, io sono &quot; + super .parla() + &quot; e faccio baubau&quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  12. 12. Incapsulamento e Polimorfismo /1 Esempio 2 <ul><li>E' molto utile utilizzare l'ereditarietà e l'incapsulamento insieme </li></ul><ul><li>Supponiamo che la nostra classe Animale gestisca il livello di fame </li></ul><ul><li>public class Animale { </li></ul><ul><li>private String nome ; </li></ul><ul><li>private int fame = 0; </li></ul><ul><li>public int getFame() { </li></ul><ul><li>return fame ; </li></ul><ul><li>} </li></ul><ul><li>protected void setFame( int fame) { </li></ul><ul><li>if (fame < 0) { this . fame = 0; </li></ul><ul><li>} else if (fame > 10) { this . fame = 10; </li></ul><ul><li>} else { this . fame = fame; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Notare che setFame() è protected </li></ul><ul><li>E' impossibile dare un valore non corretto all'attributo fame </li></ul><ul><li>Domanda: Perché è protected ? </li></ul>
  13. 13. Incapsulamento e Polimorfismo /2 <ul><li>Quando l'animale si muove la fame aumenta </li></ul><ul><li>public void muovi() { </li></ul><ul><li>if (possoAncoraMuovermi()) { </li></ul><ul><li>aumentaFame(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Prima si verifica se può ancora muoversi (linea 2) </li></ul><ul><li>Se può muoversi la fame aumenta (linea 3) </li></ul><ul><li>Il metodo muovi() è public quindi tutti possono richiamarlo </li></ul>
  14. 14. Incapsulamento e Polimorfismo /3 <ul><li>Il metodo possoAncoraMuovermi() è public perchè può essere utile al chiamante </li></ul><ul><li>Il metodo aumentaFame() può essere richiamato solo dalle classi derivate, questo impedisce che qualcuno lo chiami falsandone il valore </li></ul><ul><li>public boolean possoAncoraMuovermi() { </li></ul><ul><li>if ( fame < 10) { return true ; } </li></ul><ul><li>return false ; </li></ul><ul><li>} </li></ul><ul><li>protected void aumentaFame() { ++ fame ; } </li></ul>
  15. 15. Incapsulamento e Polimorfismo /4 Facciamo muovere Fido <ul><li>public class TestCorsaFido { </li></ul><ul><li>public static void main(String[] args) { </li></ul><ul><li>Cane fido = new Cane( &quot;Fido&quot; ); </li></ul><ul><li>while (fido.possoAncoraMuovermi()) { </li></ul><ul><li>int fameAttuale = fido.getFame(); </li></ul><ul><li>if (fameAttuale < 3) { </li></ul><ul><li>System. out .println( &quot;Sono pieno &quot; + fameAttuale); </li></ul><ul><li>} else if (fameAttuale < 6) { </li></ul><ul><li>System. out .println( &quot;Ho un languorino &quot; + fameAttuale); </li></ul><ul><li>} else { </li></ul><ul><li>System. out .println( &quot;Ho fame!!! &quot; + fameAttuale); </li></ul><ul><li>} </li></ul><ul><li>fido.muovi(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} // chiude la classe </li></ul>
  16. 16. Incapsulamento e Polimorfismo /4 Il risultato della corsa di Fido <ul><li>Sono pieno 0 </li></ul><ul><li>Sono pieno 1 </li></ul><ul><li>Sono pieno 2 </li></ul><ul><li>Ho un languorino 3 </li></ul><ul><li>Ho un languorino 4 </li></ul><ul><li>Ho un languorino 5 </li></ul><ul><li>Ho fame!!! 6 </li></ul><ul><li>Ho fame!!! 7 </li></ul><ul><li>Ho fame!!! 8 </li></ul><ul><li>Ho fame!!! 9 </li></ul>
  17. 17. Incapsulamento e Polimorfismo /5 Esempio 3 <ul><li>La classe Cane riutilizza l'algoritmo della classe Animale per aumentare la fame ma </li></ul><ul><ul><li>ogni animale brucia energie a velocità diverse </li></ul></ul><ul><ul><li>dobbiamo fare in modo che sia facile aggiungere nuovi animali alla nostra fattoria con comportamenti specializzati </li></ul></ul><ul><ul><li>l'algoritmo dell'aumento fame sta nel metodo </li></ul></ul><ul><li>protected void aumentaFame() { </li></ul><ul><li>++ fame ; </li></ul><ul><li>} </li></ul>
  18. 18. Incapsulamento e Polimorfismo /6 <ul><li>Fido diventa affamato più velocemente </li></ul><ul><ul><li>basta ridefinire cosa fa il metodo aumentaFame() nella classe Cane </li></ul></ul><ul><li>public class Cane extends Animale { </li></ul><ul><li>public Cane(String nome) { </li></ul><ul><li>super (nome); </li></ul><ul><li>} </li></ul><ul><li>protected void aumentaFame() { </li></ul><ul><li>int fameAttuale = getFame(); </li></ul><ul><li>setFame(fameAttuale + 3); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  19. 19. Incapsulamento e Polimorfismo /7 <ul><li>Senza modificare altro codice e rieseguendo il programma di test si ottiene </li></ul><ul><li>Sono pieno 0 </li></ul><ul><li>Ho un languorino 3 </li></ul><ul><li>Ho fame!!! 6 </li></ul><ul><li>Ho fame!!! 9 </li></ul>
  20. 20. Incapsulamento e Polimorfismo /8 <ul><li>Il polimorfismo permette di trattare le classi derivate come se fossero tutte del tipo della classe base </li></ul><ul><li>Cane braccobaldo = new Cane( &quot;Braccobaldo&quot; ); </li></ul><ul><li>Animale fido = new Cane( &quot;Fido&quot; ); </li></ul><ul><li>System. out .println(fido.getNome() + braccobaldo.getNome()); </li></ul><ul><li>Alla linea 2 viene creato un oggetto Cane ma viene assegnato ad un oggetto di tipo Animale </li></ul><ul><li>L'assegnazione è lecita perché Cane deriva da Animale </li></ul><ul><li>Il contrario darebbe errore </li></ul>
  21. 21. Incapsulamento e Polimorfismo /9 <ul><li>Cosa succede se si vuole &quot;convertire&quot; un oggetto Animale generico in una classe derivata? </li></ul><ul><li>Se l'assegnazione è lecita, ovvero l'oggetto generico è di tipo compatibile basta fare un cast (downcast) </li></ul><ul><li>Se l'assegnazione non è lecita viene generato un errore a runtime (non a compile time) </li></ul>
  22. 22. Incapsulamento e Polimorfismo /10 Cast - da classe base a derivata <ul><li>Il cast si ottiene mettendo tra parentesi il tipo desiderato davanti alla variabile da &quot;convertire&quot; </li></ul><ul><li>Animale fido = new Cane( &quot;Fido&quot; ); </li></ul><ul><li>Animale silvestro = new Gatto( &quot;Silvestro&quot; ); </li></ul><ul><li>// e' corretto perche' silvestro e' di tipo gatto </li></ul><ul><li>Gatto g = (Gatto)silvestro; </li></ul><ul><li>// genera errore perche' fido e' un cane non un gatto </li></ul><ul><li>Gatto g1 = (Gatto)fido; </li></ul>
  23. 23. Incapsulamento e Polimorfismo /11 operatore instanceof <ul><li>E' possibile testare un oggetto per scoprire il suo tipo utilizzando l'operatore instanceof </li></ul><ul><li>Animale fido = new Cane( &quot;Fido&quot; ); </li></ul><ul><li>if (fido instanceof Gatto) { </li></ul><ul><li>System. out .println( &quot;Fido e' un gatto&quot; ); </li></ul><ul><li>} else if (fido instanceof Cane) { </li></ul><ul><li>System. out .println( &quot;Fido e' un cane&quot; ); </li></ul><ul><li>} </li></ul><ul><li>L'utilizzo di instanceof non è una buona pratica OOP </li></ul><ul><li>Il metodo è particolarmente pesante da un punto di vita prestazionale </li></ul>
  24. 24. Override dei metodi <ul><li>Quando si ridefinisce un metodo in una classe derivata si dice che si fa override </li></ul><ul><li>Il metodo aumentaFame() nella classe Cane è quindi un override del corrispondente metodo della classe Animale </li></ul><ul><li>&quot;Fare override&quot;, &quot;derivare&quot;, &quot;specializzare&quot; sono tutti sinomini </li></ul><ul><li>Non si faccia confusione con overload dei metodi </li></ul>
  25. 25. Overload e override <ul><li>Overload – due o più metodi della stessa classe hanno lo stesso nome ma prendono argomenti diversi </li></ul><ul><li>Override – un metodo presente nella classe base viene ridefinito in una o più classi derivate </li></ul>
  26. 26. Classi e metodi astratte /1 Esempio 4 <ul><li>All'inizio abbiamo definito la classe Animale con il metodo parla() </li></ul><ul><li>Questo metodo non aveva nessuna utilità nella classe base </li></ul><ul><li>Esiste un modo per dichiarare questo metodo senza implementazione </li></ul><ul><li>Si forzano le classi derivate ad implementarlo (altrimenti non compilano) in modo da dargli la corretta implementazione </li></ul><ul><li>Una classe astratta non può essere istanziata </li></ul>
  27. 27. Classi e metodi astratti /2 <ul><li>Si crea una classe con il metodo parla astratto </li></ul><ul><li>public class Animale { </li></ul><ul><li>public String parla() { </li></ul><ul><li>return &quot;Errore: Animale generico&quot; ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>La classe diventa </li></ul><ul><li>public abstract class Animale { </li></ul><ul><li>public abstract String parla(); </li></ul><ul><li>} </li></ul>
  28. 28. In Java tutto è un oggetto Classe Object /1 <ul><li>In Java tutte le classi hanno una classe base implicita </li></ul><ul><li>Questa classe di chiama Object e contiene dei metodi utili alla Java Virtual Machine </li></ul><ul><li>Scrivere </li></ul>public class Animale extends Object { } public class Animale { } <ul><li>Equivale a scrivere </li></ul>
  29. 29. In Java tutto e' un oggetto Classe Object /2 <ul><li>La classe Object e' detta la radice della gerarchia delle classi Java </li></ul><ul><li>Tra i metodi contenuti troviamo equals e toString </li></ul>public class Object { // Verifica se due oggetti sono uguali public boolean equals(Object obj) { } // Converte un oggetto in stringa public String toString() { } }
  30. 30. Polimorfismo per interfacce /1 <ul><li>Si è visto che in Java si può derivare da una sola classe </li></ul><ul><li>Può essere necessario definire un nuovo oggetto con caratteristiche provenienti da due oggetti diversi </li></ul><ul><li>Un pappagallo vola, un cane nuota </li></ul><ul><li>Si potrebbe creare una classe PuoVolare ed una PuoNuotare che estendono Animale ma perdono di genericità </li></ul><ul><li>Anche un aereo &quot;può volare&quot; e una barca &quot;può nuotare&quot; </li></ul>
  31. 31. Polimorfismo per interfacce /2 <ul><li>Un pappagallo può volare ma un'anatra può sia volare che nuotare </li></ul><ul><li>Utilizzando l'ereditarietà abbiamo </li></ul>
  32. 32. Polimorfismo per interfacce /3 <ul><li>La classe PuoVolareENuotare è necessaria ma appesantisce inutilmente la gerarchia delle classi </li></ul><ul><li>Meglio sarebbe avere... </li></ul>
  33. 33. Polimorfismo per interfacce /4
  34. 34. Polimorfismo per interfacce /4 <ul><li>Questo si realizza in Java utilizzando le interfacce (parola riservata interface ) </li></ul><ul><li>Le interface sono simili alle classi astratte </li></ul><ul><li>Esse hanno la dichiarazione dei metodi senza implementazione </li></ul><ul><li>Possono avere solo metodi pubblic </li></ul><ul><li>Non possono avere attributi </li></ul><ul><li>Le classi derivate implementano le interfacce </li></ul>
  35. 35. Polimorfismo per interfacce /5 <ul><li>Le nostre classi diventano </li></ul>public interface PuoNuotare { public boolean nuota(); } public interface PuoVolare { public boolean vola(); }
  36. 36. Polimorfismo per interfacce /6 public class Cane extends Animale implements PuoNuotare { ... ... public boolean nuota() { return true ; } } public class Pappagallo extends Animale implements PuoVolare { ... ... public boolean vola() { return true ; } }
  37. 37. Polimorfismo per interfacce /7 public class Anatra extends Animale implements PuoNuotare, PuoVolare { ... ... public boolean nuota() { return true ; } public boolean vola() { return true ; } }
  38. 38. Quando si devono usare le interfacce <ul><li>Sempre!!! </li></ul><ul><li>Le interfacce permettono di disaccoppiare l'implementazione dalla propria definizione </li></ul><ul><li>Questo significa che e' facile sostituire il comportamento di una classe intervenendo solo sulla particolare implementazione </li></ul><ul><li>Tutte le tecnologie Java (Servlet, EJB, JMS) sono basate sul concetto di interfaccia </li></ul>
  39. 39. I package /1 <ul><li>L'edizione Standard Edition di Java (SE) contiene circa 4000 tra classi ed interfacce </li></ul><ul><li>L'edizione Enterprise Edition di Java (EE) contiene circa 300 tra classi ed interfacce </li></ul><ul><li>Una tale mole di oggetti richiede una organizzazione razionale </li></ul><ul><li>Le classi vengono organizzate in package </li></ul><ul><li>Ogni package contiene le classi logicamente correlate </li></ul>
  40. 40. I package /2 <ul><li>I principali package in java sono </li></ul><ul><li>java.lang String, Integer, Long </li></ul><ul><li>java.lang.math Sin, Cos, min, max </li></ul><ul><li>java.io File </li></ul><ul><li>java.util Date, List </li></ul><ul><li>java.sql Connection, Timestamp </li></ul>
  41. 41. I package /3 <ul><li>Se si vuole usare un metodo o una classe di un package bisogna importarlo nel proprio programma </li></ul><ul><li>Le classi presenti in java.lang vengono importate implicitamente </li></ul><ul><li>E' possibile, anzi caldamente consigliato , mettere le proprie classi in package </li></ul><ul><li>Si possono importare tutti i package che si vuole, non esistono limiti </li></ul>
  42. 42. I package /4 <ul><li>package corso.java; </li></ul><ul><li>import java.io.File; </li></ul><ul><li>import java.util.Date; </li></ul><ul><li>public class EsempioPackage { </li></ul><ul><li>public static void main(String[] args) { </li></ul><ul><li>System. out .println( &quot;Radice quadrata &quot; + Math. sqrt (144)); </li></ul><ul><li>File f = new File( &quot;a.txt&quot; ); </li></ul><ul><li>System. out .println( &quot;Dimensione file &quot; + f.length()); </li></ul><ul><li>Date oggi = new Date(); </li></ul><ul><li>System. out .println( &quot;Oggi e' &quot; + oggi); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  43. 43. I package /5 <ul><li>Un proprio package si definire con la parola riservata package </li></ul><ul><li>Un package puo' avere livelli come una directory </li></ul><ul><ul><li>Ogni livello viene separato dal carattere punto java.lang </li></ul></ul>
  44. 44. I package /6 <ul><li>Per utilizzare le classi di un package si deve fare l'import tramite la parola riservata import </li></ul><ul><li>Non e' necessario fare import per </li></ul><ul><ul><li>le classi presenti in java.lang </li></ul></ul><ul><ul><li>le classi presenti nello stesso package </li></ul></ul><ul><li>import java.io.File; </li></ul><ul><li>File f = new File( &quot;a.txt&quot; ); </li></ul>
  45. 45. Import singola classe Import intero package <ul><li>E' possibile effettuare l'import di una sola classe </li></ul>import java.io.File; import java.util.Date; import java.io.*; import java.util.Date; <ul><ul><li>Oppure di un intero package (utilizzando la sintassi con asterisco ) </li></ul></ul><ul><ul><li>L'import di un intero package è una bad practice e andrebbe utilizzato sono in quei rarissimi casi in cui si rivela indispensabile </li></ul></ul>
  46. 46. Package e classi con nomi uguali /1 <ul><li>Java ha due classi Date </li></ul><ul><ul><li>una usata per un uso generale (java.util.Date) </li></ul></ul><ul><ul><li>una usata per l'accesso tramite SQL (java.sql.Date) </li></ul></ul><ul><li>Come faccio ad utilizzare entrambe nello stesso programma? </li></ul><ul><li>import java.util.Date; </li></ul><ul><li>import java.sql.Date; ** ERRORE DI COMPILAZIONE ** </li></ul><ul><li>// oggetto di tipo java.util.Date </li></ul><ul><li>Date oggi = new Date(); </li></ul><ul><li>// Questa e' una SQL DATE ma come faccio a dirlo al compilatore? </li></ul><ul><li>// oggetto di tipo java.sql.Date </li></ul><ul><li>Date sqlOggi = new Date(oggi.getTime()); </li></ul>
  47. 47. Package e classi con nomi uguali /2 <ul><li>Bisogna risolvere l'ambiguità in fase di dichiarazione della variabile </li></ul><ul><li>import java.util.Date; </li></ul><ul><li>Date oggi = new Date(); </li></ul><ul><li>java.sql.Date sqlOggi = new java.sql.Date(oggi.getTime()); </li></ul><ul><li>Si effettua l'import solo di una delle due (non importa quale) </li></ul><ul><li>Si dichiara la seconda con il FQN (Full Qualified Name) ovvero tutto il nome package e della classe (come alla linea 3) </li></ul>

×