Originariamente inviato da Downloader
Prendiamo ad esempio la seguente istruzione: ((Classe1) c ).metodo();
Da quello che ho capito faccio il cast di c a Classe1, che è padre di Classe2.
Quindi mi aspetterei che c ora non venga più considerato di Classe2 ma di Classe1, potendo quindi invocare solo i metodi che stanno dentro a Classe1.
Ma non è cosi, infatti se lancio il codice cosi coome l'ho postato in output ricevo "METODO RISCRITTO". Perchè?
Perchè un cast non "trasforma" un oggetto in un altro, ma forza semplicemente a vedere l'oggetto come se fosse di un altro tipo. Nel tuo caso particolare, non ha alcun senso un cast del genere perchè Classe2, derivando da Classe1, è già di per sè un oggetto di Classe1 (ereditarietà).
Quello che hai fatto, riscrivendo il metodo metodo() è stato sottoporre ad override tale metodo. Lo hai riscritto, "perdendo", quindi, il riferimento al metodo originario. Questo si chiama "polimorfismo": hai un solo metodo per comportamenti diversi. L'oggetto (reale) su cui vai ad invocare tale metodo è sempre un oggetto di tipo Classe2 (che tu lo stia guardando come Classe2 o Classe1) quindi verrà richiamato il metodo più adatto al tipo di oggetto (quello a lui più vicino).

Un'altra cosa importante che vorrei capire bene è poter stabilire quando java verifica la legalità ad esempio per l'invocazione di un metodo.
Se io ad esempio scrivo cosi:
Classe1 c1 = new Classe1();
c.metodo();

so che il controllo viene fatto a tempo di complicazione (non ci sono cast).
Posso dire quindi che quando non ci sono cast (di qualsiasi tipo) tra classi con una relazione la verifica della legalità dell'invocazione dei metodi viene fatta a tempo di compilazione?

Per piacere, illuminatevi, sono decisamente confuso.

Grazie
Non è la presenza di cast o meno che determina se il controllo deve essere fatto a tempo di compilazione o a tempo di esecuzione.
Prendiamo questo esempio:
codice:
String s = "13";
Integer i = (Integer) s;
Questo codice genera un errore a tempo di compilazione: Inconvertible types.

Il controllo sull'invocazione di un metodo è sempre fatta a tempo di compilazione. Quando viene invocato un metodo viene sempre controllato il tipo dell'oggetto sul quale viene fatta l'invocazione. Se il tipo di dato non prevede l'esistenza di quel metodo è sempre il compilatore che se ne accorge.

Forse stai confondendo il controllo con l'invocazione vera e propria.

Ciò che può essere fatto a tempo di esecuzione è l'invocazione di un metodo piuttosto che un altro, ma questo riguarda il polimorfismo, non l'ereditarietà.


Ciao.