Скільки зберігає у собі int

Змінні-посилання у Java

У мові Java є змінні двох видів: змінні примітивного типу і всі інші. От про «всі інші» ми зараз і поговоримо.

Насправді точнішим буде таке визначення: є змінні примітивного типу (primitive type variables), і є вказівні змінні (reference variables). То ж це таке — вказівні змінні?

На відміну від примітивних типів, які дозволяють зберігати значення безпосередньо всередині змінних, змінні вказівних типів зберігають посилання на об’єкти. Тобто десь у пам’яті є певний об’єкт, а у вказівній змінній (синонім: змінна-посилання) просто зберігається адреса цього об’єкта в пам’яті (посилання).

Значення всередині змінних зберігають тільки примітивні типи , усі інші типи зберігають лише посилання на об’єкт . До речі, ви вже знайомі з двома такими типами змінних — це змінні типу String і змінні типу масив .

І масив, і рядок є об’єктами, які зберігаються десь у пам’яті. Змінні типу String і змінні типу масив зберігають тільки посилання на об’єкти.

Змінні int a, int b і double d є примітивними і зберігають у собі значення.

Змінна String str — вказівна і зберігає адресу (посилання) об’єкта типу String у пам’яті.

Під час присвоювання значення змінній примітивного типу це значення копіюється (дублюється). А коли відбувається присвоювання значення вказівній змінній, копіюється тільки адреса об’єкта , а власне об’єкт не копіюється .

2. Сутність посилань

У чому принципова відмінність вказівних змінних від примітивних?

Примітивна змінна схожа на коробку, де можна зберігати якесь значення. Вказівна змінна більше схожа на аркуш паперу із записаним на ньому номером телефону.

Автомобіль і ключі від автомобіля

Уявіть, що ви вирішили подарувати своєму другові на день народження автомобіль. Ви ж не запакуєте його в коробку і не понесете із собою: автомобіль для цього надто великий.

Значно зручніше взяти з собою тільки ключі від автомобіля і покласти їх в коробку відповідного розміру. А ваш друг і так усе зрозуміє, коли дістане ключі з коробки. Немає потреби приносити автомобіль, коли можна просто передати ключі.

Людина і номер її телефону

Або ще один варіант: людина і номер її телефону. Номер телефону — це не сама людина, але за цим номером можна їй зателефонувати, щось запитати, дати вказівки.

Так само й посилання використовуються для взаємодії з об’єктом. Усі об’єкти взаємодіють один з одним за допомогою посилань. Замість того, щоб «обмінюватися людьми», досить обмінятися номерами телефонів.

Коли присвоюється значення змінній примітивного типу, це значення копіюється (дублюється). А коли присвоюється значення вказівній змінній, копіюється тільки адреса об’єкта («номер телефону»), а власне об’єкт не копіюється.

Посилання мають ще одну перевагу: можна передати посилання на об’єкт у якийсь метод, і тоді метод зможе змінювати цей об’єкт, використовуючи посилання на нього, викликаючи його методи і звертаючись до даних всередині об’єкта.

3. Присвоювання посилань

Для вказівних змінних операція присвоювання полягає в тому, що змінній просто присвоюється адреса об’єкта в пам’яті. А самі об’єкти в результаті присвоєння не з’являються й не зникають.

Такий підхід дає змогу уникнути копіювання великих обсягів пам’яті. Якщо потрібно кудись передати дуже великий об’єкт, ми просто передамо в цей метод посилання на об’єкт, і все. Посилання займає значно менше місця.

Розмір усіх вказівних змінних (незалежно від типу) однаковий і становить 4 байти (як тип int). Але! Якщо ваша програма працює в 64-розрядній Java-машині, розмір усіх посилань буде 8 байтів (64 біти).

Посилання можна присвоїти лише посиланню. Не можна змінювати посилання чи присвоювати їм довільні значення.

String hello = "Привіт"; String s = hello;
String hello = "Привіт"; hello++;

4. Порожнє посилання — null

А що зберігає вказівна змінна, коли їй ще нічого не присвоєно?

Вона зберігає порожнє посилання — null . null — це спеціальне ключове слово в Java, яке позначає відсутність посилання (порожнє посилання). Значення null можна присвоїти будь-якій вказівній змінній.

Усі вказівні змінні, доки їм не присвоєно певне посилання, мають значення null .

class Person < public static String name; public static int age; >

І для примітивних, і для вказівних типів локальні змінні без значення вважаються неініціалізованими.

Якщо змінна зберігає посилання на певний об’єкт, а ви хочете видалити значення цієї змінної, просто присвойте їй посилання null.

String s = null; s = "Привіт"; s = null;

5. Передавання посилань у методи

Якщо параметрами певного методу є вказівні змінні , то значення передаються в такі змінні так само, як і у звичайні. Змінній-параметру просто присвоюється значення іншої змінної.

class Solution < public static void fill(String[] array, String value) < for (int i = 0; i < array.length; i++) array[i] = value; > public static void main(String[] args) < String[] data = new String[10]; fill(data, "Hello"); > >

Коли викликається метод fill , змінній array присвоюється посилання на масив data . Змінній value присвоюється посилання на об’єкт-рядок «Hello».

Отака ситуація буде в пам’яті перед викликом методу fill :

Отака ситуація буде в пам’яті під час виконання методу fill :

Змінні data і array посилаються (зберігають посилання) на один і той самий масив-контейнер у пам’яті.

Змінна value зберігає посилання на об’єкт-рядок Hello .

У комірках масиву також зберігаються просто посилання на об’єкт Hello .

Фактично об’єкти не дублюються — відбувається тільки копіювання посилань.

6. Порівняння з мовою С/С++

Іноді Java-програмістів на співбесідах запитують: як у Java передаються дані в методи? Часом ще й уточнюють: за посиланням чи за значенням?

Це питання походить з мови С++ — у мові Java воно не має сенсу . У мові Java змінним-параметрам завжди просто присвоюються значення змінних-аргументів. Отже, правильна відповідь — за значенням .

Але будьте готові до того, щоб пояснити свою думку, тому що вам можуть заперечити, що «примітивні типи передаються за значенням, а вказівні — за посиланням».

Ця проблема пов’язана з тим, що багато Java-програмістів були в минулому програмістами С++. А там питання «як передаються параметри в методи» відігравало дуже важливу роль.

У Java все однозначно: примітивні типи зберігають значення, вказівні теж зберігають значення — посилання. Річ у тім, що саме вважати значенням змінної.

У мові C++ змінні можуть зберігати як посилання на об’єкт, так і сам об’єкт. Це також стосується примітивних типів: у змінній можна зберігати значення або оголосити змінну посиланням на тип int . Тому, щоб не заплутатися, програмісти С++ завжди називають посилання на об’єкт посиланням , а власне об’єкт — значенням.

У С++ легко може скластися ситуація, коли одна змінна містить об’єкт, а інша — посилання на цей самий об’єкт. Тому питання, що зберігає в собі змінна — сам об’єкт чи тільки посилання на нього, — дуже важливе. Під час передавання об’єкта в метод цей об’єкт копіюється (якщо передається за значенням) або не копіюється (якщо передається за посиланням).

У Java цієї подвійності немає, і правильна відповідь буде така: у Java параметри передаються в методи за значенням. Просто у випадку із вказівними змінними це значення — посилання.

Типи даних, змінні та константи у С++

Наступна тема, що входить в основи програмування – це типи даних, змінними і константами. У більшості випадків перші теми у вивченні будь-якого курсу – це нудна теорія. Так вже складається, що щоб почати писати більш-менш цікаві програми, потрібно дізнатися деякі основи і отримати базові знання. Я, звичайно, постараюся коротше і цікавіше розкрити тему цієї статті, але будьте терплячими. У цій статті ми розберемося з тим, що ж таке типи даних і навіщо вони нам знадобляться в програмуванні, а також дізнаємось про змінні та константи.

Типи даних. Спочатку відповім “навіщо” існують типи даних . Дивіться, Припустімо, що нам потрібно написати програму, яка виводить на екран дані про вік, вагу та зріст людини. Але, щоб програма могла звертатися до цих даних, їх треба зберігати десь в оперативній пам’яті комп’ютера, а вже потім “попросити” показати їх. Для цього нам необхідні типи даних – щоб компілятор “зрозумів” скільки пам’яті повинно бути виділено для даних, і що саме в цій пам’ять буде зберігатися (ціле число (вік), дійсне (вага та зріст), символи і т. д.).

Типи даних можна розбити на три групи: числові, символьні і логічні. Щоб вказати тип даних використовуються спеціальні зарезервовані (ключові) слова. Нижче ми їх розглянемо і вкажемо скільки пам’яті для них виділяється і які дані вони можуть зберігати.

Числові типи даних: для зберігання цілих чисел (0, 33, -27 і т.д.)

int (4 байта) – зберігає числа в діапазоні від -2 147 483 648 до 2 147 483 647

short (2 байта) – зберігає числа в діапазоні від -32 768 до 32 767

long (4 байта) – зберігає числа в діапазоні від -2 147 483 648 до 2 147 483 647

Числові типи даних: д ля зберігання дійсних чисел (з плаваючою точкою: 435.332, 54.77, 3.0)

float (4 байта) – зберігає дробові числа з точністю до 7 знаков после запятой

double (8 байт) – зберігає дробові числа з точністю до 15 знаков после запятой

Символьний тип: д ля зберігання одного символу

char (1 байт) – зберігає один символ. Наприклад: ‘f’, ‘+’ або ‘4’ (як символ). Одинарні лапки обов’язкові.

Типу даних для зберігання рядків в С ++ немає. Пізніше ми з вами познайомимося з тим, яким чином можна зберігати рядки в пам’яті.

bool (1 байт) – м може приймати тільки два значення true (істина) і false (неправда)

Відразу варто звернути увагу, що все зарезервовані слова під типи даних пишуться не великими, а малими (маленькими) буквами. Якщо ви оголосите тип bool , як Bool – компілятор генерує повідомлення про помилку. В редакторі, при написанні коду, всі ключові слова С++ виділені блакитним кольором (це стосується до всіх зарезервованих слів). Так що якщо ви ввели тип, а слово не стало синім – перевірте правильність написання.

Змінними і константи. Їх назви говорять самі за себе. І змінна і константа – це певні області в оперативній пам’яті, які мають імена (ім’я задає програміст). Тільки змінна може змінювати своє значення в ході виконання програми, константа ж визначається один раз і змінюватися вже не може.

Час, наприклад, це змінна величина. Зараз, припустимо, 3 години дня, а через 2 години вже буде 5 годин вечора. А ось кількість годин у добі – це вже константа.

І змінним і константам при оголошенні обов’язково треба привласнити ім’я. Існують суворі правила, згідно з якими даються імена:

    • ім’я змінної може містити маленькі і великі літери англійського алфавіту, цифри, і ‘ _’ (нижнє підкреслення). З нижнім підкресленням імена читаються набагато легше. Порівняйте amountofapples і amount_of_apples.
      • ім’я не може починатися з цифри! amount_of_apples1 – можна, 1amount_of_apples – не можна ))
        • ім’ям НЕ може бути зарезервоване слово ( int, bool …). Якщо ви придумали ім’я змінної, ввели, а його підсвітило синім кольором, це означає, що дане слово в С++ є зарезервованим. Придумайте нове ім’я.
        • ім’я змінної повинно бути осмисленим (логічним тому, що буде зберігати дана змінна). Тобто,. навряд чи хтось здогадається, що в змінній x зберігає значення кількість яблук. Логічніше назвати таку змінну amount_of_apples.

        Оголошення і ініціалізація змінних і констант.

        Як ми можна створити змінну і визначити яке значення вона буде зберігати? Для цього нам необхідно спочатку вказати тип_даних, потім дати ім’я змінної (дотримуючись правил розглянутих вище), поставити знак = (означає привласнити) і вказати значення. Наприклад створимо змінну, яка буде зберігати значення кількості яблук: INT amount_of_apples = 7; .

        Присвоєння значення змінній при її створенні називається ініціалізація . Бажано завжди ініціалізувати змінні при створенні, навіть якщо ви не знаєте, яке значення змінна буде приймати під час роботи програми. В цьому випадку ініціалізуйте її нулем: INT amount_of_apples = 0; . Справа в тому, що оперативна пам’ять вільною не буває. І якщо ви просто створити змінну INT amount_of_apples; і не присвоїли їй ніякого значення, вона все одно буде зберігати якісь залишкові дані від попередніх програм. Тому, хоча це не помилка оголосити спочатку змінну, а нижче присвоїти їй значення, бажано привласнити значення цій змінній відразу , тим самим очистивши її від “сміття”. До речі, в MVS 2013, якщо ви спробуєте відобразити значення неініціалізованої змінної, компілятор видасть помилку.

        Що стосується констант, то значення їм має бути присвоєно відразу при створенні. Наприклад, визначимо константа, яка буде зберігати кількість днів у тижні: const int daysInWeek = 7; Щоб дати ясно зрозуміти компілятору, що це константа, а не звичайна змінна, перед типом даних обов’язково використовувати ключове слово const .

        Так, мабуть, приступимо до розгляду декількох прикладів, щоб зрозуміти і запам’ятати те, про що ми тут говорили. Не забувайте, набирати код – практикуйтесь.

Related Post

Як впливає частота процесораЯк впливає частота процесора

Тактова частота визначає швидкість роботи процесора: чим вона вища, тим швидше запускаються і працюють програми. Вона вимірюється в гігагерцах: у базових моделей вона зазвичай близько 2 ГГц, у просунутих –

Скільки живуть собаки породи ДоберманСкільки живуть собаки породи Доберман

Добермани живуть в середньому 10-12 років. Самці можуть вирости до 45 кг, тоді як самки можуть досягати 40. Добермани мають коротку шерсть. М'ясо становить основу їхнього меню — переважно яловичина,