Як видалити екземпляр класу java
Але можна встановити цей екземпляр класу значення null , щоб дозволити збиральнику сміття видалити об'єкт, який посилається змінна.
// Створення об'єкта класу MyClass MyClass
myObj
=
new
MyClass();
// Видалення посилання на об'єкт
myObj
=
null;
У цьому прикладі змінна myObj посилається на об'єкт класу MyClass. Після встановлення значення null змінна більше не посилається на об'єкт, що дозволяє смітнику видалити об'єкт.
Класи. Об'єктно-орієнтоване програмування
Java є об'єктно-орієнтованою мовою, тому такі поняття як "клас" та "об'єкт" відіграють у ньому ключову роль. Будь-яку програму на Java можна як набір взаємодіючих між собою об'єктів.
Шаблоном або описом об'єкта є клас, а об'єкт представляє екземпляр цього класу. Можна ще провести таку аналогію. У нас у всіх є деяке уявлення про людину – наявність двох рук, двох ніг, голови, тулуба тощо. Є певний шаблон – цей шаблон можна назвати класом. Реально існуюча людина (фактично екземпляр даного класу) є об'єктом цього класу.
Клас визначається за допомогою ключового слова сlass:
У разі клас називається Person. Після назви класу йдуть фігурні дужки, між якими міститься тіло класу – тобто його поля та методи.
Будь-який об'єкт може мати дві основні характеристики: стан - деякі дані, які зберігає об'єкт, і поведінка - дії, які може здійснювати об'єкт.
Для зберігання стану об'єкта у класі застосовуються поля чи змінні класу. Для визначення поведінки об'єкта у класі застосовуються методи. Наприклад, клас Person, який представляє людину, міг би мати таке визначення:
У класі Person визначено два поля: name представляє ім'я людини, а age – її вік.І також визначено метод displayInfo, який нічого не повертає та просто виводить ці дані на консоль.
Тепер використовуємо цей клас. Для цього визначимо таку програму:
public class Program < public static void main(String[] args) < Person tom; >> class Person < String name; // Ім'я int age; // вік void displayInfo()< System.out.printf("Name: %s \tAge: %d\n", name, age); >>
Як правило, класи визначаються у різних файлах. В даному випадку для простоти ми визначаємо два класи в одному файлі. Варто зазначити, що в цьому випадку лише один клас може мати модифікатор public (в даному випадку це клас Program), а сам файл коду має називатися на ім'я цього класу, тобто в даному випадку файл має називатися Program.java.
Клас представляє новий тип, тому ми можемо визначати змінні, які представляють цей тип. Так, тут у методі main визначена змінна Tom, яка представляє клас Person. Але поки ця змінна не вказує на жодний об'єкт і за умовчанням вона має значення null. За великим рахунком, ми її поки не можемо використовувати, тому спочатку необхідно створити об'єкт класу Person.
Конструктори
Крім звичайних методів, класи можуть визначати спеціальні методи, які називаються конструкторами. Конструктори викликаються під час створення нового об'єкта цього класу. Конструктори виконують ініціалізацію об'єкта.
Якщо класі не визначено жодного конструктора, то цього класу автоматично створюється конструктор без параметрів.
Вище певний клас Person немає жодних конструкторів. Тому для нього автоматично створюється конструктор за промовчанням, який ми можемо використовувати для створення об'єкта Person. Зокрема, створимо один об'єкт:
public class Program < public static void main(String[] args) < Person tom = new Person(); // Створення об'єкта tom.displayInfo(); // Змінюємо ім'я та вік tom.name = "Tom"; tom.age = 34; tom.displayInfo(); >> class Person < String name; // Ім'я int age; // вік void displayInfo()< System.out.printf("Name: %s \tAge: %d\n", name, age); >>
Для створення об'єкта Person використовується вираз new Person(). Оператор new виділяє пам'ять об'єкту Person. І потім викликається за замовчуванням конструктор, який не приймає жодних параметрів. У результаті після виконання цього виразу в пам'яті буде виділено ділянку, де зберігатимуться всі дані об'єкта Person. А змінна Tom отримає посилання на створений об'єкт.
Якщо конструктор не ініціалізує значення змінних об'єкта, вони отримують значення за замовчуванням. Для змінних числових типів це число 0, а типу string і класів - це значення null (тобто практично відсутність значення).
Після створення об'єкта ми можемо звернутися до змінних об'єкта Person через змінну tom і встановити або отримати їх значення, наприклад, tom.name = "Tom".
У результаті ми побачимо на консолі:
Name: null Age: 0 Name: Tom Age: 34
Якщо необхідно, щоб під час створення об'єкта проводилася якась логіка, наприклад, щоб поля класу отримували якісь певні значення, можна визначити у класі свої конструктори. Наприклад:
public class Program < public static void main(String[] args) < Person bob = new Person(); // виклик першого конструктора без параметрів bob.displayInfo(); другого конструктора з одним параметром tom.displayInfo(); Person sam = new Person("Sam", 25); третього конструктора з двома параметрами sam.displayInfo(); class Person < String name; // вік Person() = n; age = 18; >Person(String n, int a) System.out.printf("Name: %s \tAge: %d\n", name, age);
Тепер у класі визначено три коструктори, кожен з яких набуває різної кількості параметрів та встановлює значення полів класу.
Консольний висновок програми:
Name: Undefined Age: 18 Name: Tom Age: 18 Name: Sam Age: 25
Ключове слово this
Ключове слово this представляє посилання на поточний екземпляр класу. Через це ключове слово ми можемо звертатися до змінних методів об'єкта, а також викликати його конструктори.
public class Program < public static void main(String[] args) < Person undef = new Person(); Person("Sam", 25); sam.displayInfo(); int age; // вік Person() < this("Undefined", >Person(String name) < this(name, 18); .age = age; >void displayInfo() < System.out.printf("Name: %s \tAge: %d\n", name, age); >>
У третьому конструкторі параметри називаються так само, як і поля класу.
Так, у разі вказуємо, що значення параметра name присвоюється полю name.
Крім того, у нас три конструктори, які виконують ідентичні дії: встановлюють поля name та age.Щоб уникнути повторів, за допомогою цього можна викликати один із конструкторів класу і передати для його параметрів необхідні значення:
У результаті результат програми буде той самий, що й у попередньому прикладі.
Ініціалізатори
Крім конструктора, початкову ініціалізацію об'єкта цілком можна було проводити за допомогою ініціалізатора об'єкта. Ініціалізатор виконується до будь-якого конструктора. Тобто в ініціалізатор ми можемо помістити код для всіх конструкторів:
public class Program < public static void main(String[] args) < Person undef = new Person(); undef.displayInfo(); Person tom = new Person("Tom"); tom.displayInfo(); >> class Person < String name; // Ім'я int age; // вік / * початок блоку ініціалізатора * / <name = "Undefined"; age = 18; >/*кінець блоку ініціалізатора*/ Person() < >Person(String name) < this.name = name; >Person(String name, int age) < this.name = name; this.age = age; >void displayInfo() < System.out.printf("Name: %s \tAge: %d\n", name, age); >>
Name: Undefined Age: 18 Name: Tom Age: 18