JavaRush /Java Blog /Random-IT /Tipi di dati di riferimento in Java

Tipi di dati di riferimento in Java

Pubblicato nel gruppo Random-IT
Senza comprendere la sintassi Java è impossibile diventare uno sviluppatore serio, quindi oggi continuiamo ad imparare la sintassi. In uno degli articoli precedenti abbiamo parlato delle variabili primitive, ma poiché esistono due tipi di variabili, oggi parleremo del secondo tipo: i tipi di riferimento in Java. Quindi, cos'è? Perché i tipi di dati di riferimento sono necessari in Java? Tipi di dati di riferimento in Java - 1Immaginiamo di avere un oggetto TV con alcune caratteristiche, come numero di canale, volume dell'audio e flag attivo:

public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
Come può un tipo semplice come intmemorizzare questi dati? Ricordiamo: una variabile intè di 4 byte. Ma all'interno ci sono due variabili (4 byte + 4 byte) dello stesso tipo e anche boolean(+1 byte)... Totale: da 4 a 9, ma di regola in un oggetto vengono memorizzate molte più informazioni. Cosa fare? Non puoi inserire un oggetto in una variabile. A questo punto della nostra storia compaiono le variabili di riferimento. Le variabili di riferimento memorizzano l'indirizzo della posizione di memoria in cui si trova un oggetto specifico. Cioè, si tratta di un "biglietto da visita" con un indirizzo, con il quale possiamo trovare il nostro oggetto nella memoria condivisa ed eseguire alcune manipolazioni con esso. Un riferimento a qualsiasi oggetto in Java è una variabile di riferimento. Ecco come apparirebbe con il nostro oggetto TV:

TV telly = new TV();
Impostiamo una variabile di tipo TV con un nome tellyad un collegamento all'oggetto creato di tipo TV. Cioè, la JVM alloca memoria sull'heap per l'oggetto TV, lo crea e l'indirizzo nella sua posizione in memoria, lo inserisce nella variabile telly, che viene archiviata nello stack. Puoi leggere di più sulla memoria, in particolare sullo stack e molte altre informazioni utili, in questa lezione . Una variabile di tipo TV e un oggetto di tipo TV, hai notato? Ciò non è senza ragione: oggetti di un certo tipo devono avere variabili corrispondenti dello stesso tipo (senza contare l'ereditarietà e le implementazioni dell'interfaccia, ma ora non ne teniamo conto). Dopotutto non verseremo la zuppa nei bicchieri, vero? Si scopre che il nostro oggetto è una TV e la sua variabile di riferimento è come un pannello di controllo. Usando questo telecomando possiamo interagire con il nostro oggetto e i suoi dati. Ad esempio, imposta le caratteristiche per la nostra TV:

telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
Qui abbiamo utilizzato l'operatore punto .per accedere e iniziare a utilizzare gli elementi interni dell'oggetto a cui fa riferimento la variabile. Ad esempio, nella prima riga abbiamo detto alla variabile telly: “Dacci una variabile interna isOndell'oggetto a cui fai riferimento e impostala su true” (accendi la TV per noi).

Ridefinizione delle variabili di riferimento

Diciamo di avere due variabili di tipo riferimento e gli oggetti a cui si riferiscono:

TV firstTV = new TV();
TV secondTV = new TV();
Se scriviamo:

firstTV = secondTV;
questo vorrà dire che abbiamo assegnato come valore della prima variabile una copia dell'indirizzo (il valore dei bit dell'indirizzo) al secondo oggetto, e ora entrambe le variabili fanno riferimento al secondo oggetto (ovvero due telecomandi per lo stesso TV). Allo stesso tempo, il primo oggetto è stato lasciato senza una variabile che si riferisse ad esso. Di conseguenza, abbiamo un oggetto a cui non è possibile accedere, perché la variabile era per esso un thread così condizionale, senza il quale si trasforma in spazzatura, giace semplicemente nella memoria e occupa spazio. Questo oggetto verrà successivamente eliminato dalla memoria dal Garbage Collector . Tipi di dati di riferimento in Java - 2Puoi interrompere il filo di collegamento con un oggetto senza un altro collegamento:

secondTV = null;
Di conseguenza, ci sarà un solo collegamento all'oggetto - firstTVe secondTVnon punterà più a nessuno (il che non ci impedisce di assegnargli in futuro un collegamento a qualche oggetto come TV).

Classe di stringhe

Separatamente vorrei menzionare la classe String . Questa è una classe base progettata per archiviare e utilizzare dati archiviati come stringa. Esempio:

String text = new String("This TV is very loud");
Qui abbiamo passato una stringa da memorizzare nel costruttore dell'oggetto. Ma nessuno lo fa. Dopotutto, è possibile creare stringhe:

String text = "This TV is very loud";
Molto più conveniente, vero? In termini di popolarità d'uso Stringnon è inferiore ai tipi primitivi, ma è pur sempre una classe, e la variabile ad essa riferita non è un tipo primitivo, ma un tipo di riferimento. Abbiamo Stringquesta meravigliosa capacità di concatenare stringhe:

String text = "This TV" + " is very loud";
Di conseguenza, otterremo nuovamente il testo: This TV is very loud, poiché le due righe verranno combinate in un unico insieme e la variabile farà riferimento a questo testo completo. Una sfumatura importante è che Stringquesta è una classe immutabile. Cosa significa? Prendiamo questo esempio:

String text = "This TV";
text = text + " is very loud";
Sembra che tutto sia semplice: dichiariamo una variabile, le diamo un valore. Nella riga successiva lo cambiamo. Ma non cambiamo davvero. Trattandosi di una classe immutabile, sulla seconda riga non viene modificato il valore iniziale, ma ne viene creato uno nuovo, che a sua volta è costituito dal primo + " is very loud".

Costanti di riferimento

Nell'articolo sui tipi primitivi abbiamo toccato il tema delle costanti. Come si comporterà una variabile di riferimento quando la dichiareremo finale ?

final TV telly = new TV();
Potresti pensare che questo renderà l'oggetto immutabile. Ma no, non è vero. Tipi di dati di riferimento in Java - 3Una variabile di riferimento con un modificatore finalverrà associata a un oggetto specifico senza la possibilità di separarla in alcun modo (ridefinirla o equipararla a null). Cioè, dopo aver impostato il valore di tale variabile, codice come:

telly = new TV();
O

telly = null;
causerà un errore di compilazione. Agisce cioè finalsolo sul collegamento e non ha alcun effetto sull'oggetto stesso. Se inizialmente lo abbiamo mutabile, possiamo cambiare il suo stato interno senza problemi:

telly.soundVolume = 30;
A volte le variabili sono designate come finali anche negli argomenti del metodo!

public void enableTV (final TV telly){
   telly.isOn = true;
}
Questo viene fatto in modo che durante il processo di scrittura di un metodo questi argomenti non possano essere sovrascritti e, di conseguenza, creino meno confusione. Cosa succederebbe se denotassimo finaluna variabile di riferimento che si riferisce a un oggetto immutabile? Per esempio String:

final String PASSWORD = "password";
Di conseguenza, otterremo una costante, un analogo delle costanti di tipo primitivo, perché qui non possiamo né ridefinire il riferimento né modificare lo stato interno dell'oggetto (dati interni).

Riassumiamo

  1. Mentre le variabili semplici memorizzano bit di valore, le variabili di riferimento memorizzano bit che rappresentano il modo in cui viene recuperato un oggetto.
  2. I riferimenti agli oggetti vengono dichiarati per un solo tipo di oggetto.
  3. Qualsiasi classe in Java è un tipo di riferimento.
  4. Il valore predefinito di qualsiasi variabile di riferimento in Java è null.
  5. Stringè un esempio standard di un tipo di riferimento. Anche questa classe è immutabile.
  6. Le variabili di riferimento con un modificatore finalsono legate a un solo oggetto senza possibilità di ridefinizione.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION