русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Примітивні й вказівні типи даних


Дата додавання: 2014-05-29; переглядів: 1580.


Тепер на прикладі змінних можна проілюструвати відмінність між примітивними й вказівними типами даних. Розглянемо приклад, коли оголошуються дві змінні одному типу, прирівнюються один одному, а потім значення однієї з їх змінюється. Що станеться з другої змінної?

Візьмемо простий тип int:

 

int a = 5; // оголошуємо першу змінну і інициализуємо її

int b = a; // оголошуємо другові змінну й прирівнюємо її до першої

a = 3; // змінюємо значення першої

print (b); // перевіряємо значення другої

 

Тут і далі ми вважаємо, що функція print (...) дозволяє нам (неважливо, яким саме способом) дізнатися значення її аргументу (як правило, для цього використовують функцію зі стандартної бібліотеки System.out.println (...), яка виводить значення на системну консоль).

В результаті ми побачимо, що значення змінної b не змінилося, воно залишилося рівним 5. Це означає, що змінні простого типу зберігають безпосередньо свої значення й при прирівнювання двох змінних відбувається копіювання даного значення.

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

 

class Point {

int x, y;

}

 

Тепер складемо приклад, аналогічний наведеному вище для int-змінних, вважаючи, що вираз new Point (3,5) створює новий об’єкт крапки з координатами (3,5).

 

Point p1 = new Point (3,5);

Point p2 = p1;

p1.x = 7;

print (p2.x);

 

У третьому рядку ми змінили горизонтальну координату крапки, на якупосилалась змінна p1, і тепер нас цікавить, як це позначилося на точці, на яку посилається змінна p2. Зробивши такий експеримент, можна переконатись, що цього разу ми побачимо оновлене значення. Тобто об'єктні змінні після прирівнювання залишаються «пов'язаними»одна з одною, зміни однієї позначаються на іншій.

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

Пам'ять в Java з точки зору програміста представляється не нулями та одиницями або набором байтів, а як певний віртуальний простір, в якому існують об'єкти. І доступ до пам'яті здійснюється не за фізичною адресою або вказівником, а лише через посилання на об'єкти. Посилання повертається при створенні об'єкта й далі може бути збережене в змінну, передане в якості аргументу і т.д. Як вже говорилося, допускається наявність декількох посилань на один об'єкт. Можлива й протилежна ситуація - коли на якийсь об'єкт не існує жодного посилання. Такий об'єкт вже недоступний програмі і є «сміттям», тобто займає апаратні ресурси. Для їхнього звільнення не потрібно ніяких зусиль. До складу будь-віртуальної машини обов'язково входить автоматичний прибиральник сміття «garbage collector» - фоновий процес, який якраз і займається знищенням непотрібних об'єктів.

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


<== попередня лекція | наступна лекція ==>
Тема 5 Типи даних. Перетворення типів | Види приведення даних


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн