Hej Amigo! Jag skulle vilja berätta om variablernas interna struktur. Som du redan vet är varje variabel associerad med ett minnesområde där dess värde lagras. "

"Ja. Du berättade om det förra gången."

"Bra. Det är bra att du kommer ihåg. Då fortsätter jag."

"Alla sammansatta typer består av enklare. Och de består i sin tur av ännu enklare. Tills vi äntligen slutar med primitiva typer , som inte kan förenklas ytterligare. Det är vad de kallas - primitiva typer . För till exempel är int en primitiv typ, men String är en sammansatt typ som lagrar sina data som en teckentabell (där varje tecken är en primitiv typ char )."

"Mycket intressant. Fortsätt."

"Komposittyper bildas genom att gruppera enkla. Vi kallar sådana typer klasser . När vi definierar en ny klass i ett program deklarerar vi en ny sammansatt datatyp . Dess data kommer att vara antingen andra sammansatta typer eller primitiva typer."

Java-kod Beskrivning
public class Person
{
   String name;
   int age;
}
En ny sammansatt typ deklareras – Person.
Dess data lagras i Stringvariabeln (sammansatt typ) nameoch int(primitiv typ).age
public class Rectangle
{
   int x, y, width, height;
}
En ny sammansatt typ deklareras – Rectangle.
Den består av fyra int(primitiv typ) variabler.
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
En ny sammansatt typ deklareras – Cat. Den har följande variabler:
owner, sammansatt typ Person
territory, sammansatt typ Rectangle
age, primitiv typ int
name, sammansatt typString

"För tillfället är allt klart, hur konstigt det än kan verka."

"Stora (sammansatta) typer innehåller många små (primitiva) typer. Det är därför objekt av dessa typer tar upp mycket minne - mer än variabler av de primitiva typerna. Ibland mycket mer. Att utföra tilldelningsoperationer med sådana variabler brukade ta lång tid tid och krävde kopiering av stora delar av minnet. Det är därför variabler av sammansatta typer inte lagrar själva objektet, utan snarare bara en referens till det, dvs dess fyra-byte adress. Detta är tillräckligt för att adressera data i sådana objekt. Java-maskinen hanterar alla associerade komplexiteter."

"Jag förstod ingenting av det där."

"Vi har tidigare sagt att en variabel är som en låda. Om du vill lagra siffran 13 i den kan du skriva 13 på ett papper och lägga den i lådan."

"Men tänk dig att du behöver förvara något större i lådan (variabelt). Till exempel en hund, en bil eller din granne. Istället för att försöka trycka in det oskjutbara i lådan kan du göra något enklare: använda ett foto av hunden istället för den faktiska hunden, en registreringsskylt istället för en riktig bil, eller din grannes telefonnummer istället för din granne."

"Vi tar ett papper och skriver ner grannens telefonnummer. Det här är som en referens till ett föremål. Om vi ​​kopierar papperet med grannens telefonnummer på och lägger det i flera rutor så finns det nu fler referenser till din granne. Men som tidigare har du fortfarande bara en granne. Det är vettigt, eller hur?"

"En viktig egenskap för att lagra data på detta sätt är att du kan ha många referenser till ett enda objekt "

"Vad intressant! Jag har nästan fattat det. Säg mig en gång till, snälla - vad skulle hända om jag tilldelar en variabel av en sammansatt typ till en annan variabel av samma sammansatta typ?"

"Då skulle de två variablerna lagra samma adress. Det betyder att om du ändrar data för objektet som refereras av en variabel, ändrar du data som refereras av den andra . Båda variablerna refererar till samma objekt . Naturligtvis kan det finnas många andra variabler som också lagrar referenser till den."

"Vad gör variabler av sammansatta (referens/klass) typer om de inte innehåller en referens till ett objekt? Är det ens möjligt?"

"Ja, Amigo. Du går före mig med din fråga. Det är möjligt. Om en variabel av en referenstyp (sammansatt) inte lagrar en referens till ett objekt, lagrar den vad som kallas "null" referens'. I grund och botten betyder detta att det refererar till ett objekt vars adress är 0. Java-maskinen skapar dock aldrig objekt med denna adress, så den vet alltid att om en referensvariabel innehåller 0, så pekar den inte på något objekt ."

Java-kod Beskrivning
String s;
String s = null;
Motsvarande uttalanden.
Person person;
person = new Person();
person = null;
Vi skapar en personvariabel vars värde är null.
Vi tilldelar den adressen till ett nyskapat personobjekt.
Vi tilldelar variabeln null.
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Vi skapar ett Cat-objekt och lagrar dess adress i variabel cat; cat.owner är lika med null.
Vi sätter cat.owner lika med adressen till ett nyskapat Person-objekt.
cat.owner.name är fortfarande lika med null.
Vi sätter cat.owner.name lika med "Gud"

"Förstod jag dig rätt? Variabler är uppdelade i två typer: primitiva typer och referenstyper. Primitiva typer lagrar värden direkt, medan referenstyper lagrar en referens till ett objekt. Primitiva typer inkluderar int, char, boolean och många andra. Referens typer inkluderar allt annat. Vi använder klasser för att skapa dem."

"Du har helt rätt, min pojke."

"Så, du säger att du har förstått allt. Här är några uppgifter som hjälper dig att förstärka din kunskap."