Certo che c'entrano le fasi di compilazione e di esecuzione.
Il binding statico avviene, appunto, in fase di compilazione: in questa fase tutto ciò che è possibile collegare staticamente viene collegato.
Facciamo un esempio:
codice:
Cerchio c = new Cerchio();
System.out.println( c.getRaggio() );
In questo esempio c'è ben poco da dire: il metodo getRaggio() verrà agganciato staticamente, perchè si hanno tutte le informazioni utili a sapere quale classe utilizzare (Cerchio, c'è scritto!).
Al contrario, il binding dinamico può avvenire solo in fase di esecuzione (run-time): in questa fase vengono collegati i metodi che non possono essere collegati a tempo di compilazione (perchè mancano le informazioni su quale sia la classe reale che verrà utilizzata).
E' l'esempio fatto nell'altra discussione, che riprendo:
codice:
public double differenzaAree(Figura f1, Figura f2) {
return f1.calcolaArea() - f2.calcolaArea();
}
A tempo di compilazione non è possibile sapere a priori quale tipo di oggetto venga passato a ciascuno dei due parametri (supponi, ad esempio, che il tipo di figura venga scelto dall'utente durante l'esecuzione del programma).
Quando dovrà essere eseguito il metodo calcolaArea() sull'oggetto f1 (idem per l'oggetto f2, ovviamente) verrà applicato il binding dinamico (chiamato anche late-binding) che andrà a collegare il metodo dell'oggetto opportuno. Ovviamente ciò non può essere fatto a tempo di compilazione: quando compili la tua applicazione non sai a priori che oggetti andrà a creare l'utente, che la userà dopo...
Spero di aver chiarito un po' questi due concetti.
Ciao.