PDA

Visualizza la versione completa : [java] variabile di referenza


Lucked
07-12-2003, 02:27
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?

Zero-2
07-12-2003, 09:53
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.

Lucked
07-12-2003, 15:42
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

LeleFT
07-12-2003, 16:43
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.

Lucked
07-12-2003, 16:54
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..

LeleFT
07-12-2003, 17:07
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.

Xadoom
07-12-2003, 19:21
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();
:cry:
Ciao

Lucked
08-12-2003, 14:05
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.

LeleFT
08-12-2003, 14:51
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.

Loading