Quote Originariamente inviata da Gas75 Visualizza il messaggio
Questa parte mi è chiara, ma grazie per l'approfondimento/riepilogo.
Allora probabilmente hai dubbi su overload e/o override.

Quote Originariamente inviata da Gas75 Visualizza il messaggio
ho perso ogni riferimento al metodo mangia() di Persona (come sto verificando) o posso ancora invocarlo in qualche modo che non conosco e che quindi non so applicare?
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.