I riferimenti in un oggetto Java

Nel linguaggio Java un oggetto può possedere riferimenti verso altri oggetti.

Cos'è un riferimento

Un riferimento è un puntatore all'indirizzo di memoria dove si trova il valore dell'oggetto.

Non è una copia del valore.

Un esempio pratico

Creo una classe Punto contenente due variabili locali x e y.

Per ciascuna definisco i metodi get e set.

  1. class Punto {
  2. private int x;
  3. private int y;
  4. public void setX(int k) { x=k; }
  5. public void setY(int k) { y=k; }
  6. public int getX() { return x; }
  7. public int getY() { return y; }
  8. }

Poi creo una classe Aereo per indicare un oggetto volante sul radar.

  1. class Aereo {
  2. private Punto coordinate;
  3. public void setCoordinate(Punto o) { coordinate=o; }
  4. public Punto getCoordinate() { return coordinate; }
  5. }

Ora scrivo la classe main del programma java.

Nella riga 3 creo un oggetto air1 istanza della classe Aereo.

  1. public class prova {
  2. public static void main(String[] args) {
  3. Aereo air1 = new Aereo();
  4. Punto posizione = new Punto();
  5. posizione.setX(2);
  6. posizione.setY(3);
  7. air1.setCoordinate(posizione);
  8. System.out.println(air1.getCoordinate());
  9. Punto xy = air1.getCoordinate();
  10. System.out.println(xy.getX());
  11. System.out.println(xy.getY());
  12. posizione.setX(3);
  13. posizione.setY(4);
  14. System.out.println(xy.getX());
  15. System.out.println(xy.getY());
  16. }
  17. }

Nella riga 4 creo un oggetto posizione istanza della classe Punto.

Nelle righe 5 e 6 assegno i valori 2 e 3 alle variabili x e y dell'oggetto posizione per indicare che si trova alle coordinate (2,3).

Nella riga 7 assegno le coordinate (2,3) all'oggetto air1 passandogli come riferimento l'oggetto posizione.

Attenzione. Non sto passando i valori (2,3) ma il riferimento all'indirizzo di memoria dove si trova l'oggetto posizione. E' l'oggetto posizione ad avare i valori (2,3). Questo passaggio è cruciale per comprendere tutto il resto.
il riferimento dell'oggetto

Quando interrogo l'oggetto air1 con il metodo getCoordinate (riga 8) la classe restituisce il riferimento e non i valori

Si tratta di un numero esadecimale collegato all'indirizzo di memoria.

provajava.Punto@3796751b

Nella riga 9 rilevo le coordinate dell'oggetto air1 come oggetto punto e lo salvo nella variabile xy.

Poi uso metodi getX e getY (righe 10-11) sulla variabile xy che restituiscono rispettivamente

2
3

Pertanto, l'oggetto air1 si trova alle coordinate (2,3).

Cosa succede se cambiano i valori x e y dell'oggetto posizione?

Nelle righe 12 e 13 modifico il valori x e y dell'oggetto posizione da (2,3) a (3,4) con i metodi setX e setY.

Nelle righe 14 e 15 stampo nuovamente i valori x e y dell'oggetto air1.

3
4

Senza averli modificati, sono cambiati anche i valori x e y dell'oggetto air1.

Questo accade perché il campo coordinate dell'oggetto air1 è un riferimento all'oggetto posizione.

una spiegazione pratica

Quando cambiano i valori x e y dell'oggetto posizione, automaticamente cambiano anche le coordinate dell'oggetto air1.

E' un esempio di utilizzo dei riferimenti tra oggetti in linguaggio Java.

Come copiare un riferimento in Java

Se copio il riferimento contenuto in una variabile e lo assegno a un'altra variabile, entrambe le variabili hanno lo stesso riferimento.

Aereo air2 = air1;

Dopo la copia entrambe le variabili contengono lo stesso riferimento di memoria.

provajava.Punto@3796751b

Pertanto, l'oggetto associato al riferimento può essere modificato con entrambe le variabili.

In pratica le variabili si comportano reciprocamente come alias dell'indirizzo in memoria di un oggetto.

il riferimento delle due variabili è lo stesso

Quando una variabile viene modificata (es. air2), la modifica viene apportata all'oggetto situato al riferimento di memoria.

Pertanto, una qualsiasi modifica apportata tramite una variabile interessa anche l'altra variabile (es. ari1).

Nota. E' un aspetto da tenere in seria considerazione. La copia della variabile non è una fotografia degli attributi dell'oggetto in un determinato istante ma solo la copia del suo indirizzo di memoria (riferimento).

E così via.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Le classi in Java