Polimorfismo
Da wikipedia:
In informatica, il termine polimorfismo (“avere molte forme”) viene usato in senso generico per riferirsi a espressioni che possono rappresentare valori di diversi tipi (dette espressioni polimorfiche).
Il polimorfismo in Java ha due diversi tipi di comportamenti:
- polimorfismo dei metodi
- polimorfismo dei dati
Il polimorfismo dei metodi si riferisce all’overloading e overriding dei metodi, che abbiamo già visto.
Analizziamo ora il polimorfismo dei dati.
Il polimorfismo dei dati permette ad una classe di assumere tutte le forme dei figli.
Esempio
interface Animale{ } public class Mucca implements Animale{ public static void main(String[] args) { Animale a = new Mucca(); } }
Grazie a questa caratteristica, possiamo usare oggetti che espongono una stessa interfaccia, ma hanno implementazioni diverse.
Ricordiamoci infatti, che una interfaccia definisce un contratto generale che le sottoclassi devono soddisfare. Quindi, possiamo utilizzare, ad esempio in un metodo, una interfaccia che varierà il suo comportamento in base a quale sottoclasse effettivamente verrà utilizzata.
Esempio
public interface Animale { public void emettiVerso(); } public class Cavallo implements Animale { @Override public void emettiVerso() { System.out.println("NITRITO"); // TODO Auto-generated method stub } } public class Leone implements Animale{ @Override public void emettiVerso() { System.out.println("RUGGITO"); } } public class Mucca implements Animale { @Override public void emettiVerso() { // TODO Auto-generated method stub System.out.println("MUGGITO"); } public void emettiVerso(int c) { // TODO Auto-generated method stub System.out.println("MUGGITO forter"); } } public class Prova { public static void faiVerso(Animale l) { l.emettiVerso(); } public static void main(String[] args) { Leone l1 = new Leone(); faiVerso(l1); Mucca m = new Mucca(); faiVerso(m); Cavallo c = new Cavallo(); faiVerso(c); // // Animale[] arrayAnimali = new Animale[5]; arrayAnimali[0] = new Mucca(); arrayAnimali[1] = new Mucca(); arrayAnimali[2] = new Cavallo(); arrayAnimali[3] = new Mucca(); arrayAnimali[4] = new Leone(); for(int i = 0; i < arrayAnimali.length; i++) { Animale anim = arrayAnimali[i]; } for(Animale e: arrayAnimali) e.emettiVerso(); // chiamata di un metodo che appartiene solo al figlio Animale muc = new Mucca(); muc.emettiVerso(1); //errore compilazione, metodo non visi-bile } }
Da notare che tutte le classi discendono dalla classe Object; di conseguenza Object può assumere la forma di qualsiasi classe.
Esempio
Object o = new Cavallo();