Ciao,
devo assolutamente capire bene come java gestisce le regole di sottotipaggio e come e perchè alcune istruzioni errare vengono segnalate a tempo di compliazione o a tempo di esecuzione.
Ad esempio:
codice:
public class Classe1
{
public void metodo() { System.out.println("CIAO A TUTTI");}
public void metodo2() { System.out.println("CIAO A TUTTI e 2");
}
}
codice:
public class Classe2 extends Classe1
{
public void metodo() { System.out.println("METODO RISCRITTO");
}
public static void main(String[] args)
{
Classe2 c = new Classe2();
(Classe1 c ).metodo();
}
}
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è?
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