Allora probabilmente hai dubbi su overload e/o override.
codice:public class Persona { public void mangia() { System.out.println("mangia di Persona"); } } public class Studente extends Persona { public void mangia() { // questo è un override !! System.out.println("mangia di Studente"); } public String getMatricola() { return "12345"; } }
(non guardare tanto che getMatricola torna un valore fisso. Più realmente/sensatamente dovrebbe essere un campo di Studente)
Dato questo:
Persona p = new Studente();
Allora:
1) Una invocazione
String m = p.getMatricola();
NON è possibile. Il compilatore ha in mano solo un reference di tipo Persona e può "vedere" solo i metodi noti in Persona. Il compilatore NON può invocare getMatricola() su un Persona, sebbene l'oggetto realmente istanziato è Studente che HA il getMatricola().
2) Una invocazione
p.mangia();
è perfettamente lecita per il compilatore. La variabile p è di tipo Persona che ha un mangia(). Ma qui entra in gioco il polimorfismo e il concetto di "override". Il metodo eseguito è quello dell'oggetto realmente ISTANZIATO. E l'oggetto è di tipo Studente.
Quindi il mangia() eseguito è quello di Studente, NON quello di Persona.