Newsgroup: it.comp.java
Titolo: Binding statico e dinamico

Ciao a tutti,
ha fatto qualche ricerca su google, trovando notizie molto frammentarie.
Qualcuno di voi ha qualche riferimento da darmi per capire meglio il
concetto di binding statico e dinamico dei metodi in Java?
Grazie mille.
Ciao
Franco



In java il binding statico non esiste, lo trovi nel c++,
esiste solo binding dinamico.
Ciao
Luca

 esiste solo binding dinamico.
Se non sbaglio i metodi static hanno un binding statico, quindi in fase di
compilazione. Questo perche non sono polimorfici. I metodi non static hanno
invece binding dinamico dato che in compilazione non è possibile sapere
quale dei possibili metodi overrided deve essere invocato.
Ciao
Luca 

 Il concetto di binding statico e dinamico dei metodi in Java
Il concetto di "binding" si riferisce al collegamento della chiamata di un
metodo/funzione al suo relativo corpo, al suo "pezzo di codice".
Es. in linguaggio C (per capirlo non c'è bisogno che tu lo conosca):
--> la chiamata di funzione:
stampa("Ti anticipo che questo è un binding statico");
--> sarà collegata a:
void stampa(char *s)
{
    printf("%s", s);
}
Fin qui, ok.
Tuttavia, ci sono appunto due tipi di collegamento: statico e dinamico.
Nell'esempio mostrato il binding è di tipo STATICO poichè il collegamento
viene effettuato in fase di compilazione/linking: prima dell'esecuzione del
programma, quindi,ogni chiamata deve essere univocamente e sicuramente
collegata al suo effettivo codice; tale collegamento non può essere
indefinito (il compilatore/linker ti darebbe errore) e non può cambiare in
fase di esecuzione!
Il binding DINAMICO, invece, concede molta più flessibilità, poichè il
collegamento avviene in questo caso in fase di esecuzione a seconda del tipo
di oggetto che effettua la chiamata: il compilatore si preoccuperà solo di
assicurare che la chiamata sia collegabile a "qualche" metodo di quella
classe o di una sua derivata, senza interessarsi di "quale" sarà.
Ciò è fondamentale per permettere il polimorfismo.
Es. in Java:
--> abbiamo due classi, l'una derivata dall'altra:
class Base
{
    public void stampa()
    {
        System.out.println("Classe Base");
    }
}
class Derivata extends Base
{
    public void stampa()
    {
        System.out.println("Classe Derivata");
    }
}
--> se poi da qualche parte ho:
Base c; // riferimento alla classe base
// assegno al riferimento c, a seconda di qualche condizione, un oggetto
Base o Derivata...
c.stampa();
--> ... stamperò un messaggio diverso a seconda dell'oggetto a cui si
riferisce c!
La chiamata al metodo, quindi, non viene staticamente assegnata ad un
determinato codice, ma dinamicamente collegata a seconda del tipo di
oggetto!
In C il collegamento dinamico non esiste.
In C++ lo devi richiedere esplicitamente.
In Java è invece il comportamento di default, tranne che tu non dichiari i
tuoi metodi "final"; in questo caso ne bloccherai il collegamento dinamico
e, cosa più importante, ne vieterai l'override.
Spero di non essermi dilungato troppo e di essere stato comunque chiaro.
Saluti,
Sergio B.

P.S.
Dimenticavo: in Java, sono collegati staticamente anche i metodi privati e
quelli statici.
Saluti,
Sergio B.

Grazie a tutti.
Ciao
Franco