Java

February 24th, 2009


« Microsoft викинула Java з Windows XP   |   Parlez-vous Java »

Через те, що об’єктні змінні є посилальними, при привласненні не відбувається копіювання об’єкту. Так, якщо написати

Foo foo, bar;
.
bar = foo;

те відбудеться копіювання адреси із змінній foo в змінну bar. Тобто foo і bar указуватимуть на одну і ту ж область пам’яті, тобто на один і той же об’єкт; спроба змінити поля об’єкту, на який посилається змінна foo, мінятиме об’єкт, з яким пов′язана змінна bar, і навпаки.
Якщо ж необхідно отримати саме ще одну копію початкового об’єкту, користуються або методом (функцією-членом, в термінології C++) clone(), що створює копію об’єкту, або ж копіюючим конструктором.

Метод clone() вимагає, щоб клас реалізовував інтерфейс Cloneable (про інтерфейси див. нижче). Якщо клас реалізує інтерфейс Cloneable, за умовчанням clone() копіює всі поля ( дрібна копія ). Якщо потрібно не копіювати, а клонувати поля (а також їх поля і так далі), треба перевизначати метод clone().
Визначення і використання методу clone() часто є нетривіальним завданням [1].

Збірка сміття

В мові Java неможливе явне видалення об’єкту з пам’яті - натомість реалізована збірка сміття. Традиційним прийомом, що дає складальникові сміття «натяк» на звільнення пам’яті, є привласнення змінної порожнього значення null. Це, проте, не означає, що об’єкт, замінений значенням null, буде неодмінний і негайно видалений.
Даний прийом всього лише усуває посилання на об’єкт, тобто відв′язує покажчик від об’єкту в пам’яті. При цьому слід враховувати, що об’єкт не буде видалений складальником сміття, поки на нього указує хоч би одне посилання з використовуваних змінних або об’єктів.
Існують також методи для ініціації примусової збірки сміття, але не гарантується, що вони будуть викликані виконуючим середовищем, і їх не рекомендується використовувати для звичайної роботи.

Класи і функції


Tags: , , , , , ,

Загальна інформація


Схожі записи

Категория: Загальна інформація |

Комментарии