Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    Domanda JVM e polimorfismo in JAVA

    Ciao...devo fare un esame che è diviso in un primo compito di teoria ed un secondo compto di Java...

    Per la parte di teoria su un vecchio compito c'è questa domanda sulla JVM che non saprei bene come rispondere (ovvero visto che ho perso parte dei miei appunti :muro: non sò se c'è anche altro da dire).

    La domanda è:

    Descrivere i possibili binding calcolati dalla JVM nel corso dell'esecuzione di un'applicazione

    Io direi così:

    In Java c'è l'overloading degli operatori (operatori sovraccarichi) cioè esistono più versioni dello stesso operatore dipendentemente dal tipo di dati usati.
    Per esempio per l'operatore di somma ci sarà un operatore + per valori interi ed un operatore + per valori double e così via:
    +(int, int)
    +(double, double)

    Questo avviene per i tipi built in di Java, quando invece creo una nuova classe stò definendo un nuovo tipo di dati (ovvero la struttura dati e gli operatori necessari ad operare su di essa) ed in Java si usa la sola COMPATIBILITA' PER NOME ovvero che due differenti tipi definiti dall'utente non sono mai compatibili anche se avessero la stessa struttura (a differenza di altri linguaggi che adottano una compatibilità per struttura).
    In Java opero sugli oggetti istanza di una classe solo con i metodi di tale classe e quindi 2 diversi tipi di dato non saranno mai compatibili perchè avranno ognuna i propri metodi.

    Tutto questo ragionamento per passare al concetto di polimorfismo e da quà ai binding eseguiti dalla JVM.

    Se per esempio ho una classe Rettangolo che mi istanzia oggetti che rappresentano dei rettangoli con i lati paralleli agli assi cartesiani:

    public Rettangolo{
    ........
    ........
    ........
    }

    Se volessi avere poi una classe Quadrato che mi rappresenti quadrati avente i lati paralleli agli assi cartesiani potrei ottenerla estendendo la classe Rettangolo senza doverla riscrivere partendo da 0:

    class Quadrato extendes Rettangolo{
    ........
    ........
    ........
    }

    nel cui codice ci metterei solo le differenze rispetto a quadrato tra cui il metodo costruttore ma vabbè non mi addentro oltre...in pratica ridefinisco solo tutti i metodi del supertipo che non si comporterebbero bene nel sottotipo.

    A questo punto se nel main dichiaro una variabili Q come Rettangolo e poi lo costuisco come un quadrato:

    Rettangolo R;
    R = new Quadrato(P,4)

    Posso farlo tranquillamente ma a questo punto anche se il tipo effettivo con cui ho creato l'oggetto è Quadrato per il compilatore è un Rettangolo perchè l'ho dichiarato tale...pertanto potrei usare solo i metodi della classe Rettangolo e non potrei usare qualche nuovo metodo definito solo nella classe Quadrato (come ad esempio un metodo per calcolare l'area del cerchio inscritto nel quadrato) e se chiamassi un metodo di quadrato su un oggetto di tale tipomi darebbe errore, tipo:

    double y = R.ragioCerchioInscritto(); darebbe errore

    Quindi R è una variabili polimorfica perchè può assumere vari tipi...e se in Java una variabile è polimorfica:

    1) Deve essere un sottotipo del tipo con cui l'ho dichiarata
    2) Posso usare solo operazioni del supertipo con cui l'ho dichiarata.

    Questo perchè Java è un linguaggio fortemente tipizzato e posso usare la variabile solo con la forma con cui l'ho dichiarata ed i controlli li farà il compilatore garantendo così che il linguaggio sia strongly typed (cioè è garantito chenon ci saranno errori di tipo dopo la compilazione).

    Ma nel main potrei avere anche una situazione di questo tipo:

    [code]
    .........
    lanciaMoneta
    if(TESTA) R = new Rettangolo(P,8,2);
    else R = new Quadrato(P,4);
    R.dilata;
    }

    A questo punto il compilatore non può sapere a priori se l'oggetto R sarà creato come Rettangolo o come Quadrato e non saprà se usare il metodo dilata() (che è stato modificato nella classe Quadrato rispetto alla versione definita nella classe Rettangolo) del sottotipo Quadrato o del supertipo Rettangolo.

    Per risolvere questo problema il binding tra l'INVOCAZIONE DEI METODI ed il CORPO DEI METODI viene eseguito a runtime dalla JVM.

    Si dice che JAVA è polimorficoper inclusione cioè che le diverse forme che una variabile può assumere sono solo i sottotipi di una classe...ed infatti per dichiarare un oggetto che può assumere qualsiasi forma lo devo dichiarare come Object che è la superclasse generele a tutte le classi.

    C'è altro da dire? Sopratutto la JVM esegue altri tipi di binding durante l'esecuzione di un'applicazione (ho perso gli appunti della lezione successiva quindi booo)

    Grazie
    Andrea

  2. #2
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    E va bene che hai perso gli appunti, però lo sforzo di cercarti il materiale dovresti farlo tu!

    Ti rispondo in questo modo perchè sarebbe tuo compito cercare quantomeno nel forum, prima di aprire un thread: binding statico e dinamico
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    capisco che possa essere un po' lungo da leggere...tuttavia su quello che ho scritto sono abbastanza sicuro che sia giusto...volevo solo sapere se la JVM oltre al binding tra l'invocazione del metodo ed il corpo del metodo stesso esegue altri tipi di binding a runtime...di cui non ho proprio idea di quali potrebbero essere...

  4. #4
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    capisco che possa essere un po' lungo da leggere...
    In effetti c'è anche questo.
    Poi c'è anche che non penso sia questo il modo migliore per prepararsi a un'esame.
    Ma sopratutto c'è il fatto che ce ne sono diversi di thread sul binding. Quello che ti ho scritto sopra non era neppure il più chiaro.

    volevo solo sapere se la JVM oltre al binding tra l'invocazione del metodo ed il corpo del metodo stesso esegue altri tipi di binding a runtime...
    Il binding è stato più volte definito in più thread come collegamento tra invocazione del metodo e corpo del metodo.
    Per sintetizzare, il binding può essere di due tipi: dinamico e statico. Se hai ben chiara la differenza tra i due sei a cavallo.
    Potrei sbagliarmi ma queste due parole non mi pare siano mai comparse nella tua risposta.

    Ti consiglio solo una cosa: cerca binding nel forum. Tra i thread che compaiono ce ne è almeno uno che fa esattamente al caso tuo, ben spiegato e ben esemplificato. E molto più sintetico...

    Ciao!
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    Originariamente inviato da Pastore12
    In effetti c'è anche questo.
    Poi c'è anche che non penso sia questo il modo migliore per prepararsi a un'esame.
    Ma sopratutto c'è il fatto che ce ne sono diversi di thread sul binding. Quello che ti ho scritto sopra non era neppure il più chiaro.


    Il binding è stato più volte definito in più thread come collegamento tra invocazione del metodo e corpo del metodo.
    Per sintetizzare, il binding può essere di due tipi: dinamico e statico. Se hai ben chiara la differenza tra i due sei a cavallo.
    Potrei sbagliarmi ma queste due parole non mi pare siano mai comparse nella tua risposta.

    Ti consiglio solo una cosa: cerca binding nel forum. Tra i thread che compaiono ce ne è almeno uno che fa esattamente al caso tuo, ben spiegato e ben esemplificato. E molto più sintetico...

    Ciao!
    bhe la JVM ovviamente esegue binding dinamici, altrimenti se sono statici vengono eseguiti in fase di compilazione ed ho iniziato il mio discorso facendo notare la differenza.
    Sò bene cos'è un binding statico e cos'è un binding dinamico...tuttavia non è vero che il binding è solo tra l'invocazione di un metodo ed il suo corpo, esistono altri tipi di binding come quello tra nome di una variabile ed il suo tipo, tra nome di una variabile ed il suo valore (L-value e R-value)...e volevo sapere se magari m'era sfuggito qualcosa e se la JVM si occupava anche di altri tipi di binding in determinati casi...

    Poi scusa come ci si dovrebbe preparare ad un esame? Io ho cercato sui miei appunti, me li sono studiati e sono venuto a chiedere se le mie conoscienze erano complete o se mancava qualcosa...mica sono venuto quà a postare una domanda e dirvi: "Bella rega, rispondetemi voi che non sò come si fà e non sò manco di che si stà parlando"

  6. #6
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    tuttavia non è vero che il binding è solo tra l'invocazione di un metodo ed il suo corpo, esistono altri tipi di binding come quello tra nome di una variabile ed il suo tipo, tra nome di una variabile ed il suo valore (L-value e R-value)...
    Ecco.. a me, che ho fatto il corso 8 anni fa, sta cosa qua non torna. E molto probabilmente non saprebbero risponderti la maggioranza degli utenti del forum. (Una statistica sarebbe interessante..)

    Ok, ora andiamo completamente fuori tema...
    Poi scusa come ci si dovrebbe preparare ad un esame?
    Se hai dei dubbi chiedi a qualcuno che ne sappia più di te. Oppure a un tuo compagno di corso che ne sappia quanto te, così vi confrontate. Ma come fai a fidarti di quello che ti viene detto in un forum? Tu mica lo sai chi è che ti risponde. Qui c'è gente che di sicuro può spiegarti come funzionano le cose, ma di gente che sappia spiegarti le cose per bene, con la precisione necessaria a una domanda d'esame, ne trovi molti di meno. Un paio, credo. (E io non sono certo tra quei due.) Ma resta il fatto che da chiunque venga la risposta, può essere imprecisa. E da quel che ricordo io, a seconda dell'umore del docente, una imprecisione si può pagar cara in sede d'esame. L'ideale per te è che ti vengano a dire: "come dice il link della sun ...", ma in tal caso avresti potuto andarci tu a cercare quel che ti occorreva sul sito della sun.
    Insomma.. a te occorrono fonti certificate, che però dovresti trovarti da te. Mentre su un forum, puoi aver tutto tranne questo.

    E scusa una domanda.. ma anche questo mi suona strano. Gli appunti li hai persi, ma non era previsto un libro di riferimento per il corso di esame?


    edit

    Giusto per chiarire meglio il concetto, Johnathan G Campbell potrebbe essere benissimo un docente di un corso su java. Secondo lui:
    da Introduction to OOP:
    Note: Late binding is synonymous with dynamic binding and run-time binding. This contrasts with early binding -- static binding, compile-time binding -- in which a function call is bound to a definite function at compile time. Late binding becomes operable when the type of a reference (variable) may change during the execution of a program -- according to the type of the last value assigned to it.
    Forse il concetto di binding è solo questo: compile-time (static) o run-time (dynamic oppure late). E gli altri tipi di binding (sulle variabili)? Forse li contempla solo il tuo docente...
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    C'è anche questa discussione sul binding in cui avevo risposto io.
    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.