Ciao, Amico! Vorrei parlarvi della struttura interna delle variabili. Come già sai, ogni variabile è associata a un'area di memoria in cui è memorizzato il suo valore. "

"Sì. Me ne hai parlato l'ultima volta."

"Fantastico. È un bene che tu ricordi. Vado avanti, allora."

"Tutti i tipi compositi sono costituiti da tipi più semplici. E loro, a loro volta, sono costituiti da tipi ancora più semplici. Fino a quando, alla fine, ci ritroviamo con tipi primitivi , che non possono essere ulteriormente semplificati. È così che vengono chiamati: tipi primitivi . Per esempio, int è un tipo primitivo, ma String è un tipo composito che memorizza i suoi dati come una tabella di caratteri (dove ogni carattere è un tipo primitivo char )."

"Molto interessante. Vai avanti."

"I tipi compositi sono formati raggruppando quelli semplici. Chiamiamo tali tipi classi . Quando definiamo una nuova classe in un programma, dichiariamo un nuovo tipo di dati composito . I suoi dati saranno altri tipi compositi o tipi primitivi."

codice java Descrizione
public class Person
{
   String name;
   int age;
}
Viene dichiarato un nuovo tipo composito: Person.
I suoi dati sono memorizzati nella Stringvariabile (tipo composito) namee intnella variabile (tipo primitivo).age
public class Rectangle
{
   int x, y, width, height;
}
Viene dichiarato un nuovo tipo composito: Rectangle.
Consiste di quattro intvariabili (di tipo primitivo).
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
Viene dichiarato un nuovo tipo composito: Cat. Ha le seguenti variabili:
owner, tipo composito Person
territory, tipo composito Rectangle
age, tipo primitivo int
name, tipo compositoString

"Per ora, tutto è chiaro, per quanto strano possa sembrare."

"I tipi grandi (compositi) contengono molti tipi piccoli (primitivi). Ecco perché gli oggetti di questi tipi occupano molta memoria, più delle variabili dei tipi primitivi. A volte molto di più. L'esecuzione di operazioni di assegnazione con tali variabili richiedeva molto tempo tempo e richiedeva la copia di ampie sezioni di memoria, ecco perché le variabili di tipo composito non memorizzano l'oggetto stesso, ma solo un riferimento ad esso, cioè il suo indirizzo di quattro byte, sufficiente per indirizzare i dati in tali oggetti. La macchina Java gestisce tutte le complessità associate."

"Non ho capito niente di tutto questo."

"In precedenza abbiamo detto che una variabile è come una scatola. Se vuoi memorizzare il numero 13 in essa, puoi scrivere 13 su un pezzo di carta e metterlo nella scatola."

"Ma immagina di dover conservare qualcosa di più grande nella scatola (variabile). Ad esempio, un cane, un'auto o il tuo vicino. Invece di provare a spingere l'impossibile nella scatola, potresti fare qualcosa di più semplice: usa una foto del cane invece del cane vero, una targa invece di un'auto vera, o il numero di telefono del tuo vicino invece del tuo vicino".

"Prendiamo un pezzo di carta e annotiamo il numero di telefono del vicino. Questo è come un riferimento a un oggetto. Se copiamo il pezzo di carta con sopra il numero di telefono del vicino e lo mettiamo in diverse scatole, ora ci sono più riferimenti al tuo vicino. Ma, come prima, hai ancora un solo vicino. Ha senso, no?"

"Una caratteristica importante dell'archiviazione dei dati in questo modo è che puoi avere molti riferimenti a un singolo oggetto "

"Che interessante! Ci sono quasi riuscito. Dimmi ancora una volta, per favore - cosa succederebbe se assegnassi una variabile di tipo composito a un'altra variabile dello stesso tipo composito?"

"Quindi le due variabili memorizzerebbero lo stesso indirizzo. Ciò significa che se si modificano i dati dell'oggetto a cui fa riferimento una variabile, si modificano i dati a cui fa riferimento l'altra . Entrambe le variabili fanno riferimento allo stesso oggetto . Naturalmente, potrebbero essercene molte altre variabili che memorizzano anche i riferimenti ad esso."

"Cosa fanno le variabili di tipo composito (riferimento/classe) se non contengono un riferimento a un oggetto? È possibile?"

"Sì, Amigo. Mi stai anticipando con la tua domanda. È possibile. Se una variabile di un tipo di riferimento (composito) non memorizza un riferimento a un oggetto, allora memorizza ciò che è noto come 'null riferimento". Fondamentalmente, ciò significa che fa riferimento a un oggetto il cui indirizzo è 0. Tuttavia, la macchina Java non crea mai oggetti con questo indirizzo, quindi sa sempre che se una variabile di riferimento contiene 0, allora non punta a nessun oggetto ."

codice java Descrizione
String s;
String s = null;
Dichiarazioni equivalenti.
Person person;
person = new Person();
person = null;
Creiamo una variabile persona il cui valore è nullo.
Gli assegniamo l'indirizzo di un oggetto Person appena creato.
Assegniamo null alla variabile.
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Creiamo un oggetto Cat e memorizziamo il suo indirizzo nella variabile cat; cat.owner è uguale a null.
Impostiamo cat.owner uguale all'indirizzo di un oggetto Person appena creato.
cat.owner.name è ancora uguale a null.
Impostiamo cat.owner.name uguale a "God"

"Ho capito bene? Le variabili sono divise in due tipi: tipi primitivi e tipi di riferimento. I tipi primitivi memorizzano i valori direttamente, mentre i tipi di riferimento memorizzano un riferimento a un oggetto. I tipi primitivi includono int, char, boolean e molti altri. Riferimento i tipi includono tutto il resto. Usiamo le classi per crearli."

"Hai assolutamente ragione, ragazzo mio."

"Allora, dici di aver capito tutto. Ecco alcuni compiti per aiutarti a rafforzare le tue conoscenze."