Il polimorfismo è la possibilità di creare oggetti di tipo superclasse (anche astratta!!!) usando i costruttori delle sue sottoclassi, rendendo i metodi della superclasse un’interfaccia comune a cui l’oggetto istanziato dalla sottoclasse si può riferire. Ciò rende possibile l’upcasting e downcasting.

Il polimorfismo si basa sul fatto che una variabile di un tipo A può contenere un riferimento a un oggetto del tipo A o di una qualsiasi sua sottoclasse.

Esempio:

Animale a = new Gatto();
a = new Chihuahua();

Ciò è possibile grazie al binding dinamico.

Si usa quando vogliamo utilizzare oggetti diversi ma con caratteristiche comuni.

Per esempio

ArrayList<Forma> forme = new Arraylist<>();
 
/* riempi la lista di forme */
 
for (Forma f: forme) {
	f.disegna()
}

disegnerà correttamente le forme diverse, tutti oggetti di classi diverse (come Triangolo, Quadrato, etc.) che ereditano dalla superclasse Forma.