Polimorfismo in Java
L'esecuzione di un metodo su un oggetto è sempre determinata dal tipo dell’oggetto in Java e non dal tipo della variabile. La stessa operazione può essere svolta in modi diversi, a seconda dell'oggetto a cui ci si riferisce. Questa semantica si chiama polimorfismo ("molte forme") ed è caratteristica dei linguaggi Object-Oriented.
Esempio 1: SavingsAccount e BankAccount
Si ha un oggetto di tipo SavingsAccount al quale viene applicato il metodo deposit. Siccome SavingsAccount è una sottoclasse di BankAccount e in entrambe le classi è presente un metodo deposit, quale metodo viene invocato, quello di BankAccount o quello ridefinito in SavingsAccount? Viene invocato il metodo deposit di SavingsAccount in questo caso dall’interprete (e non dal compilatore).
Esempio 2: Metodi sovraccarichi println
Una forma di polimorfismo a proposito dei metodi è il metodo println, che è in realtà un metodo scelto fra alcuni metodi con lo stesso nome ma con firme diverse. Nell’esempio 1 si parla di late binding (selezione posticipata) perché la decisione è presa dall’interprete. Mentre nell’esempio 2 si parla di early binding (selezione anticipata) perché la decisione è presa dal compilatore.
Controllo del tipo e instanceof
Se si vuole controllare il tipo dell'oggetto a cui una variabile oggetto si riferisce, si può usare l’operatore instanceof. Restituisce true se la variabile oggetto contiene un riferimento (sta puntando) ad un oggetto del tipo specificato dal secondo argomento.
Esempio
SavingsAccount collegeFund = new SavingsAccount(10);
BankAccount anAccount = collegeFund;
if (anAccount instanceof SavingsAccount) <- Restituisce true
SavingsAccount a = (SavingsAccount) anAccount;