PDA

View Full Version : [java]caricamento classi derivate


prazision
29-05-2005, 14:18
dunque su un libro (non vorrei fare pubblicità subliminale :Prrr: ) ho trovato(sta parlando del momento in cui si esegue una classe Figlia derivata da una classe padre Padre):"La prima cosa che accade quando si esegue Java su Figlia è l'accesso a Figlia.main per cui il caricatore cerca il codice compilato della classe Figlia(che si trova in un file chiamato Figlia.class.
Nel processo di caricamento, il caricatore si accorge che la classe è un'estensione di una classe base che viene quindi caricata..."

Mi chiedo: viene quindi caricata prima la classe figlia^ giusto?
accade sempre così?

grazie
ciao

^TiGeRShArK^
29-05-2005, 14:28
se non sbaglio la classe figlia ha la "precedenza" sulla classe padre...
se per esempio hanno metodi uguali o si vuole usare qualke metodo della classe padre bisogna usare la parola kiave parent (o qualkosa del genere....)

prazision
29-05-2005, 14:37
si ok ma io dico a livello di caricamento delle classi.
viene caricata sempre prima la classe figlia?

cmq grazie mille per la risposta

kingv
29-05-2005, 15:48
si ok ma io dico a livello di caricamento delle classi.
viene caricata sempre prima la classe figlia?


non è detto, dipende dal classloader.

da una prova che ho fatto al volo con quello del jdk 1.5.0_01 viene caricata prima quella padre.

prazision
29-05-2005, 15:51
grazie (come va??)

ma il classloader non carica prima una o l'altra seguendo qualche spiegazione logica??

kingv
29-05-2005, 16:08
grazie (come va??)

ma il classloader non carica prima una o l'altra seguendo qualche spiegazione logica??


tutto bene ;)

non conosco esattamente le strategie che hanno scelto, di sicuro all'avvio di un'applicazione il "primordial class loader" (quello "nativo") carica un gran numero di classi anche se probabilmente non le utilizzerà (probabilmente si è scelto di peggiorare un po' le performance all'avvio per migliorarle poi in esecuzione).
il perchè venga caricato prima il padre e poi il figlio non lo so :boh:

prazision
29-05-2005, 16:12
mmm ok

non mi viene in mente nulla ma non si potrebbero verificare dei 'disastri' (oggi soono unpo' catastrofico) caricando prima l'uno o prima l'altro?? (ti sei fatto di nuovo fregare dalle mie ossessioni :D )
cmq grazie

kingv
29-05-2005, 20:47
mmm ok

cmq grazie


non sei convinto, lo so :p
se hai tempo prova a cercare sulle specifiche della jvm, sono pubbliche e il comportamento del classloader dovrebbe essere spiegato lì dentro.
per quanto riguarda i potenziali disastri non mi viene in mente nulla, anzi me ne vengono in mente di possibili se così non fosse :fagiano:

prazision
29-05-2005, 23:51
non sei convinto, lo so :p
se hai tempo prova a cercare sulle specifiche della jvm, sono pubbliche e il comportamento del classloader dovrebbe essere spiegato lì dentro.
per quanto riguarda i potenziali disastri non mi viene in mente nulla, anzi me ne vengono in mente di possibili se così non fosse :fagiano:


quindi dici che è meglio che venga caricata prima la classe padre?

ok

kingv
30-05-2005, 09:02
quindi dici che è meglio che venga caricata prima la classe padre?

ok

sì, dato che se le classi in gioco contengono delle sezioni statiche per l'inizializzazione secondo me il fatto che venga caricata prima la figlia potrebbe dar luogo a problemi.
se trovo il tempo cerco di scrivere un esempietto.

N.B. non sono sicuro, sto solo ragionandoci ;)

prazision
30-05-2005, 10:03
provo anchio stasera, grazie

prazision
30-05-2005, 22:01
boh, ho solo visto che nello stesso esempio fa vedere come avvenga prima l'inizializzazione static della classe base rispetto all'inizializzazione static della classe derivata (e cmq dalle parole del libro sembra che venga caricata prima la classe derivata , quindi i fatti forse non sono collegati tra di loro)

sto però parlando di cose di cui so poco o nulla :mc: :mc: :mc: :mc: :mc: :mc: :mc: :mc: (e non ho manco tempo per approfondire)




ciao (grazie kingv)

kingv
30-05-2005, 22:38
boh, ho solo visto che nello stesso esempio fa vedere come avvenga prima l'inizializzazione static della classe base rispetto all'inizializzazione static della classe derivata

guarda probabilemente era proprio l'esempio di potenziali problemi che mi era venuto in mente pensando se fosse caricata prima la figlia.

se pensi che in caso di classi non astratte una "figlia" è una classe che estende e specializza (o in alcuni casi reimplementa) le funzionalità della classe padre, mi sembra logico che prima che venga chiamato il metodo costruttore della figlia deve essere chiamato quello della classe padre, così come le inizializzazioni incluse dentro parti di codice "static".
Il rischio sarebbe che potresti far riferimento nella figlia a membri non ancora inizializzati nel padre, con conseguenze sicuramente negative (NullPointer ecc.ecc.)

prazision
30-05-2005, 23:01
beh per quanto riguarda le inizializzazioni penso proprio funzioni come dici tu (che è poi come dice il libro)altrimenti si correrebbero seri rischi

era il processo di caricamento che mi lascia dei dubbi ma fa nulla

grazie mille