Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Java] Binding Statico e Dinamico

    Binding vuol dire testualmente "collegamento".
    So che, ma correggetemi se sbaglio, nel momento in cui una applicazione Java viene compilata (?) viene creata una tabella dei metodi di ogni classe.
    A questo punto, per tutto ciò che è static, private, un costruttore o protected si attua binding statico, altrimenti si parla di binding dinamico.
    C'entrano qualcosa le fasi di compilazione e di esecuzione?
    E più in generale, qualcuno potrebbe chiarirmi questi due concetti?

  2. #2
    Nessuno mi aiuta?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Se mi permettete, volevo fare un po' di chiarezza sull'argomento.

    Si parla di static (o "early") binding quando il compilatore è già in grado di determinare, prima della esecuzione del programma, quale è la variabile che verrà utilizzata o quale è la implementazione del metodo che verrà eseguita.

    Si parla di dynamic (o "late") binding quando la scelta di quale implementazione del metodo eseguire non è conosciuta dal compilatore ma è determinata a runtime in base all'oggetto realmente istanziato.

    In Java si ha uno static binding quando si invoca:
    - un membro static (variabile o metodo)
    - una variabile di istanza
    - un metodo di istanza marcato private
    - un metodo di istanza invocato tramite la keyword super

    Invece si ha un dynamic binding quando si invoca:
    - un metodo di istanza (purché non si cada nei due casi sopra indicati)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    E scusi la domanda sciocca, ma come si fa ad invocare un metodo d'istanza che è private???

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da ragnonerodocet
    come si fa ad invocare un metodo d'istanza che è private???
    Dall'esterno della classe non si può .... solo dall'interno della classe in cui è dichiarato il metodo private.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.