Здравей, Амиго! Бих искал да ви разкажа за вътрешната структура на променливите. Както вече знаете, всяка променлива е свързана с област от паметта, където се съхранява нейната стойност. "

— Да. Ти ми каза за това последния път.

"Чудесно. Хубаво е, че си спомняте. Тогава ще продължа."

„Всички съставни типове се състоят от по-прости. А те на свой ред се състоят от още по-прости. Докато накрая стигнем до примитивни типове , които не могат да бъдат допълнително опростени. Така се наричат ​​– примитивни типове . например int е примитивен тип, но String е съставен тип, който съхранява своите данни като table със знаци (където всеки знак е примитивен тип char )."

— Много интересно. Продължавай.

„Съставните типове се формират чрез групиране на прости. Ние наричаме такива типове класове . Когато дефинираме нов клас в програма, ние декларираме нов съставен тип данни . Неговите данни ще бъдат or други съставни типове, or примитивни типове.“

Java code Описание
public class Person
{
   String name;
   int age;
}
Декларира се нов съставен тип – Person.
Неговите данни се съхраняват в Stringпроменлива (композитен тип) nameи intпроменлива (примитивен тип).age
public class Rectangle
{
   int x, y, width, height;
}
Декларира се нов съставен тип – Rectangle.
Състои се от четири int(примитивен тип) променливи.
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
Декларира се нов съставен тип – Cat. Той има следните променливи:
owner, съставен тип Person
territory, съставен тип Rectangle
age, примитивен тип int
name, съставен типString

„Засега всичко е ясно, колкото и странно да изглежда.

"Големите (съставни) типове съдържат много малки (примитивни) типове. Ето защо обектите от тези типове заемат много памет - повече от променливите на примитивните типове. Понякога много повече. Извършването на операции за присвояване с такива променливи отнема много време време и изискваше копиране на големи участъци от паметта.Ето защо променливите от съставни типове не съхраняват самия обект, а по-скоро само препратка към него, т.е неговия четириbyteов address.Това е достатъчно за addressиране на данните в такива обекти. Java машината се справя с всички свързани сложности."

— Нищо от това не разбрах.

„По-рано казахме, че променливата е като кутия. Ако искате да съхраните числото 13 в нея, можете да напишете 13 на лист хартия и да го поставите в кутията.“

„Но си представете, че трябва да съхранявате нещо по-голямо в кутията (променлива). Например куче, кола or вашия съсед. Вместо да се опитвате да напъхате ненатисканото в кутията, можете да направите нещо по-лесно: използвайте снимка на кучето instead of на истинското куче, регистрационен номер instead of истинска кола or телефонния номер на вашия съсед instead of вашия съсед."

"Вземаме лист хартия и записваме телефонния номер на съседа. Това е като препратка към обект. Ако копираме листчето с телефонния номер на съседа и го поставим в няколко кутии, вече има повече препратки на вашия съсед. Но, Howто и преди, все още имате само един съсед. Това има смисъл, нали?"

„Важна характеристика на съхраняването на данни по този начин е, че можете да имате много препратки към един обект

„Колко интересно! Почти го разбрах. Кажете ми още веднъж, моля – Howво ще стане, ако присвоя променлива от съставен тип на друга променлива от същия съставен тип?“

„Тогава двете променливи ще съхраняват един и същ address. Това означава, че ако промените данните на обекта, към който се отнася една променлива, вие променяте данните, към които се отнася другата . И двете променливи се отнасят към един и същи обект . Разбира се, може да има много други променливи, които също съхраняват препратки към него."

"Какво правят променливите от съставни (референтни/класови) типове, ако не съдържат препратка към обект? Това изобщо възможно ли е?"

„Да, Амиго. Изпреварваш ме с въпроса си. Това е възможно. Ако променлива от референтен (съставен) тип не съхранява референция към обект, тогава тя съхранява това, което е известно като „нула reference'. По принцип това означава, че препраща към обект, чийто address е 0. Java машината обаче никога не създава обекти с този address, така че винаги знае, че ако референтната променлива съдържа 0, тогава тя не сочи към ниHowъв обект ."

Java code Описание
String s;
String s = null;
Еквивалентни твърдения.
Person person;
person = new Person();
person = null;
Създаваме променлива person, чиято стойност е нула.
Присвояваме му address на новосъздадения обект Person.
Присвояваме null на променливата.
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Създаваме обект Cat и съхраняваме address му в променлива cat; cat.owner е равно на нула.
Задаваме cat.owner equals на address на новосъздадения обект Person.
cat.owner.name все още е равно на нула.
Задаваме cat.owner.name равно на "Бог"

„Правилно ли ви разбрах? Променливите са разделени на два типа: примитивни типове и референтни типове. Примитивните типове съхраняват стойности директно, докато референтните типове съхраняват препратка към обект. Примитивните типове включват int, char, boolean и много други. типовете включват всичко останало. Ние използваме класове, за да ги създадем."

— Напълно си прав, момчето ми.

"И така, казвате, че сте разбрали всичко. Ето няколко задачи, които ще ви помогнат да затвърдите знанията си."