Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [java] variabile di referenza

    vorrei sapere come mai quando si istanzia un oggetto, si crea una variabile dello stesso tipo dell'oggetto, ma scusate...la variabile che punta l'oggetto non deve contenere solo un indirizzo?

  2. #2
    Infatti ,la variabile contiene un indirizzo , però la variabile deve essere dello stesso tipo o di un tipo compatibile con quell'oggetto, altrimenti non è possibile fare l'assegnazione.
    Cioè non puoi far puntare una variabile di tipo int ad un oggetto di tipo Vector.
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Non mi hai detto nulla di nuovo :bubu: Strano, no? Forse si vede che tiene traccia delle suddivisioni dell'oggetto(variabili e metodi), però di questo sui libri di testo non se ne parla, e si dice semplicemente che la variabile deve contenere solo l'indirizzo dell'oggetto anche se poi non si spiega il perchè i tipi devono essere gli stessi

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Il tipo deve essere lo stesso perchè il compilatore deve sapere quanta memoria allocare nello heap per quell'oggetto. E' vero che la variabile in se contiene solo un indirizzo, ma questo fatto è del tutto trasparente al programmatore (in Java, infatti, i puntatori non esistono). Se il compilatore vedesse solo una variabile con un numero non saprebbe quanta memoria allocare nello heap per contenere l'oggetto a cui essa fa riferimento. Comunque, dal punto di vista del programmatore, non interessa il fatto che gli oggetti siano allocati nello heap e le variabili siano solamente dei puntatori: il programmatore ha la sensazione di lavorare con un oggetto della classe di cui è stata definita quella variabile. E' per questo che sono stati inventati i linguaggi di alto livello.


    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    l'ennesima stranezza di Java

    in conclusione quindi si hanno variabili puntatori ad oggetto, valide solo per oggetti appartenenti a quella classe.

    Classe1 mioOggetto

    mio oggetto può solo vedere solo istanze di Classe1. Cosa poco flessibile e che mi pare tutt'ora strana..

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non capisco dove ti appaia strana questa cosa... la programmazione ad oggetti non permette certo di avere una variabile dichiarata di un tipo che fa riferimento ad un oggetto di un altro tipo. Qui è questione di teoria, non di stranezze del linguaggio.

    Seconda cosa: se una variabile è dichiarata di tipo Classe1 e classe 1 deriva da Classe2 allora la variabile è anche di tipo Classe2 (ereditarietà).

    Terza cosa: Java non permette al programmatore di vedere i puntatori per un semplice fatto di sicurezza. I puntatori rendono MOLTO MENO sicuro un linguaggio, cosa che Java tenta di evitare.


    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

  7. #7
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Ad un oggetto "Classe1 ogg" può essere assegnato qualsiasi oggetto che estende la Classe1, è qui la potenza, ad esempio ad un oggetto "Macchina miaMacchina" può instanziarsi
    miaMacchina = new Corvette()
    miaMacchina = new Ferrari()
    e non solo mia macchina = new OldFordFiesta();

    Ciao
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Qui è questione di teoria, non di stranezze del linguaggio.
    Certo, ma io sto discutendo solo su un piano teorico.."Strano" proprio perchè, nel fare in modo che una variabile punta un oggetto, potrebbe essere automatico il fatto che il compilatore riconosca di che tipo è l'oggetto e lo attribuisca per la variabile, boh forse lo trovo strano solo io...verificherò l'uso delle variabili referenze fatto da Xadom.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non può assolutamente essere automatico: una variabile puntatore contiene al suo interno solo un numero, che indica una locazione di memoria. Quella locazione di memoria potrebbe contenere QUALSIASI tipo di informazione (una stringa, un numero, l'intestazione di un oggetto o, addirittura, un'altro puntatore!). Cos'è che dice al compilatore COSA stà puntando la variabile x? Il tipo! Questo succede anche in linguaggi come C/C++: questi linguaggi ti permettono di manipolare direttamente i puntatori e, come tutte le altre variabili, esse possono essere incrementate e decrementate. Cosa vuol dire incrementare (o decrementare) un puntatore? Significa farlo puntare alla locazione di memoria successiva. Qual è la locazione di memoria successiva? Boh: se il puntatore punta ad un valore intero di 2 byte, la locazione successiva è quella posta 2 byte dopo. Se punta ad un float di 4 byte, la locazione successiva si trova 4 byte dopo. Se punta ad un oggetto di 10 byte la locazione successiva è posta 10 byte dopo. Solo il tipo può determinare di quanto effettuare l'incremento (o decremento). E questo vale anche per Java, con l'unica differenza che in Java non si possono manipolare direttamente i puntatori (dal punto di vista del programmatore, ma per il compilatore non c'è differenza).


    Quello che ha detto Xadoom è perfettamente giusto. Questa è la potenza dell'ereditarietà nella programmazione Object Oriented ed il compilatore, per poterla realizzare, deve sapere di che tipo sia la variabile che il programmatore ha dichiarato.


    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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.