Salve a tutti, mi sono accorto di avere un pò di confusione sul concetto di overriding e di se e quando viene a fatta a tempo di compilazione.
Faccio un esempio di quello che non mi torna:

codice:
class A{
    String method(A a){
        return "a";
    }}
    
    class B extends A{
        String method(A a){
            return "b";
        }
        
        String method(B b){
            return "c";
        }
    }
    
public class Lab3_1 {

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        A c = new B();
        System.out.println(a.method(a));
        System.out.println(b.method(b));
        System.out.println(c.method(c));
    }
}
In questo caso l'output è "a c b"; Quindi nel terzo caso stampa b perchè viene scelta la classe in maniera dinamica quindi B, mentre viene scelto il metodo in maniera statica quindi A per cui viene chiamato il metodo che prende A di B quindi viene stampato b. E fin qui tutto ok.

In questo secondo caso invece:
codice:
class A2 {
    public void print(int num){
        System.out.println("Ciao da A: " + num);
    }
}

class B2 extends A2{
   public void print(char c){
       System.out.println("Ciao da B: " + c);
   }
    
}
public class lab3_2 {


    public static void main(String[] args) {
        A2 a = new A2();
        B2 b = new B2();
        a=b;
        a.print('a');
    }
}
C'è un output del tipo "Ciao da B: 92". Il problema è che seguendo il ragionamento che ho fatto prima dovrebbe stampare "Ciao da A: a". Perchè in questo caso la classe viene scelta staticamente e non dinamicamente?

È chiaro che c'è qualche mia lacuna di fondo, in ogni caso se potete darmi una mano ve ne sarei grato :-)