Здравей, Амиго! Бих искал да ви разкажа за вътрешната структура на променливите. Както вече знаете, всяка променлива е свързана с област от паметта, където се съхранява нейната стойност. "
— Да. Ти ми каза за това последния път.
"Чудесно. Хубаво е, че си спомняте. Тогава ще продължа."
„Всички съставни типове се състоят от по-прости. А те на свой ред се състоят от още по-прости. Докато накрая стигнем до примитивни типове , които не могат да бъдат допълнително опростени. Така се наричат – примитивни типове . например int е примитивен тип, но String е съставен тип, който съхранява своите данни като table със знаци (където всеки знак е примитивен тип char )."
— Много интересно. Продължавай.
„Съставните типове се формират чрез групиране на прости. Ние наричаме такива типове класове . Когато дефинираме нов клас в програма, ние декларираме нов съставен тип данни . Неговите данни ще бъдат or други съставни типове, or примитивни типове.“
Java code | Описание |
---|---|
|
Декларира се нов съставен тип – Person . Неговите данни се съхраняват в String променлива (композитен тип) name и int променлива (примитивен тип).age |
|
Декларира се нов съставен тип – Rectangle . Състои се от четири int (примитивен тип) променливи. |
|
Декларира се нов съставен тип – 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 | Описание |
---|---|
|
Еквивалентни твърдения. |
|
Създаваме променлива person, чиято стойност е нула. Присвояваме му address на новосъздадения обект Person. Присвояваме null на променливата. |
|
Създаваме обект Cat и съхраняваме address му в променлива cat; cat.owner е равно на нула. Задаваме cat.owner equals на address на новосъздадения обект Person. cat.owner.name все още е равно на нула. Задаваме cat.owner.name равно на "Бог" |
„Правилно ли ви разбрах? Променливите са разделени на два типа: примитивни типове и референтни типове. Примитивните типове съхраняват стойности директно, докато референтните типове съхраняват препратка към обект. Примитивните типове включват int, char, boolean и много други. типовете включват всичко останало. Ние използваме класове, за да ги създадем."
— Напълно си прав, момчето ми.
"И така, казвате, че сте разбрали всичко. Ето няколко задачи, които ще ви помогнат да затвърдите знанията си."