Поняття класу. До цього класи розглядалися нами як цілком завершені невеликі програми і мали лише навчальне призначення. Вони розроблялися з метою практичного ознайомлення із синтаксисом мови Java, а також для вивчення алгоритмічних конструкцій та елементів алгоритмізації. Програми з такими класами були досить простими і на практиці в такому вигляді майже не застосовуються. У цьому розділі розглянемо класи, наближені до практичного використання.
Клас є основою ООП мовою Java. ООП виникло у зв'язку з не- обхідністю чіткої структуризації великих програм за рахунок на дання їм блочної структури. Для цього дані й код їх опрацювання розробники мови об'єднали в єдину структуру (інкапсулювали), назвали класом, а код опрацювання даних методом. Умовно клас можна розглядати як шаблон, із якого можна виготовити скільки завгодно приладів одного типу. Отже, клас - це логічна структура, на основі якої можна отримати однотипні екземпляри класу, тобто скільки завгодно об'єктів даного класу. Наприклад, якщо клас розроблено для обчислення об'єму конуса, то за його допомогою можна обчислити об'єми скількох завгодно конусів.
Класи реальних програм складаються з iмен змінних різного типу, які називають змінними екземплярів (полями класу), і програмного коду (методу) їх опрацювання. Але найпростіші класи можуть містити лише одні змінні екземплярів або лише програмний код. Аналогом методу в мовах процедурного програмування є підпрограми, функції, процедури. Таким чином, загальний склад класу можна подати формулою: КЛАС = ТИП І ЗМІННІ ЕКЗЕМПЛЯРА + КОД ОПРАЦЮВАННЯ ДАНИХ Один клас може містити інші класи, які називають внутрішніми класами, а також блоки, тобто сукупність команд у фігурних дужках. Об'єкти, що створюються на основі класу, називають екземплярами цього класу. Клас визначає новий тип даних, який можна застосовувати для створення об'єктів саме даного типу. Тому часто говорять, що клас - це шаблон об'єкта, а об'єкт це екземпляр класу. Звідси випливає, що терміни об'єкт і екземпляр класу це синоніми.
Отже, клас – це логічна структура, а об’єкт – його конкретна фізична реалізація. Щоб чіткіше усвідомити різницю між класом і об'єктом, наведемо приклад із повсякденного життя. Описати яблуко можна за допомогою його властивостей, наприклад ваги, кольору, форми, смаку, терміну зберігання тощо. Але існують конкретні сорти яблук, наприклад, ранет, кальвіль, антонівка, які мають конкретні значення властивостей. Наприклад, вага яблука ранет становить близько 110 г, його колір — жовтий, солодкий, термін зберігання тривалий. У цьому випадку загальний опис яблука можна розглядати як клас, а опис окремих сортів яблук його екземплярами, тобто об'єктами.
Отже, кожний об'єкт можна визначати певним шаблоном, який називають класом. Для використання класу в мові Java необхідно його описати. В описі класу вказують тип і імена змін- них, які він містить, а також метод їх опрацювання. Опис класу починається з ключового слова class, за яким слідує його ім'я й у фігурних дужках тіло класу. Таким чином, оголошення класу має таку структуру: class ім'я класу{тіло класу}Тіло класу складається з опису змінних екземпляра й методів, які разом називають членами класу. Змінні екземпляра (поля класу) це тип і імена змінних, а також масивів або об'єктів. Більш загальна структура визначення класу має такий вигляд:
Із наведеної структури видно, що клас може містити декілька методів і декілька змінних екземпляра. Отже, клас створюється не для конкретних значень даних, а для абстрактних даних, тобто змінних. Змінні, що оголошуються всередині класу, називають змінними екземпляра, а методи цього класу і змінні екземпляра - членами класу. Кожний об'єкт (тобто кожний екземпляр класу) містить власні копії змінних класу. Тому змінні, оголошені в класі, називають змінними екземпляра. Це означає, що дані одного об'єкта відокремлені від даних іншого об'єкта і мають різні значення. Класи можна створювати різними способами. Далі розглянемо чотири варіанти створення класів на прикладі розв'язування одного завдання, а саме - обчислення об'єму двох конусів із за- даними значеннями радіуса й висоти.
ОГОЛОШЕННЯ ОБ’ЄКТІВКлас створює новий тип даних, назва якого співпадає з на- звою (іменем) класу. Після оголошення класу його тип можна використовувати для створення об'єктів даного типу. Наприклад, якщо клас має ім'я Mons, то й тип даних об'єкта має таку саму назву. Об'єкти класу можна оголошувати у два етапи. На першому етапі необхідно оголосити його змінну, яка ще не визначає об'єкт, а є лише посиланням на об'єкт. На другому етапі резервується пам'ять для об'єкта. Резервування пам'яті здійснюється дина- мічно (тобто під час виконання програмного коду) за допомогою оператора nеw. Він повертає посилання (адресу зарезервованої пам'яті) на об'єкт і зберігає його у змінній. Це свідчить про те, що усі об'єкти класу повинні створюватися динамічно, тобто під час виконання програми.
Приклад. Нехай у класі з іменем Коn необхідно оголосити об'єкт із іменем alcon. Це можна зробити за допомогою таких двох команд: Kon alcon //оголошення посилання на об'єкт alcon = new Kon //резервування пам'яті для об'єкта Перша команда означає, що змінна alcon е посиланням на об'єкт класу Kon, а друга команда резервує пам'ять для реального об'єкта і присвоює змінній alcon посилання на цей об'єкт, тобто адресу пам'яті для нього. На практиці об'єкти створюють не двома, а однією командою такої структури: ім'я класу ім'я об'єкта = new ім'я класу (); Наприклад, створити об'єкт alcon класу Коn можна командою: Kon alcon = new Kon ();. У круглих дужках можна вказувати конкретні значення аргументів об'єкта. Із порядком їх використання ознайомимося пізніше.
Акцентуємо особливу увагу на понятті «змінні екземплярів», Детальніше його розглянемо пізніше, а наразі опишемо його сут- ність на конкретному прикладі. Нехай у класі оголошені дві змінні: a ib, які є катетами прямокутного трикутника. У цьому класі є також метод обчислення площі такого трикутника на осно ві значень цих катетів. Припустимо, що потрібно розрахувати площі двох трикутників із назвами trik1 i trik2. Зрозуміло, що для кожного трикутника змінні а i b набувають різних значень. Тоді для першого трикутника значення його катетів можна позначити як trik1.a i trik1.b, а другого - trik2.a i trik2.b. Отже, для кожного об'єкта кожна змінна набуває окремого значення, тому іх і назва- ли змінними екземпляра.
Структура класу, що не містить коду. Приклад. Дано конус із радіусом r і висотою һ. Потрібно обчислити його об'єм. Надамо класу, який визначає тільки ці дві змінні екземпляра r (радіус) ih (висота), ім'я Коn. Він не містить ніяких методів і має таку структуру:class Kon {double r, h;}Нагадаємо, що змінні, оголошені у класі, називають змінними екземпяра. Клас визначає новий тип даних із назвою Коn. Створимо об'єкт alkon цього класу за допомогою однієї команди: Kon alkon = new Kon ();.
Структура класу, що не містить коду. Важливо розуміти, що після створення об'єкта він міститиме власну копію кожної змінної екземпляра, які визначені в класі, тобто в даному випадку змінних r i h. Для наведеного прикладу об'єкт alkon містить копії змінних r i h. Для того щоб мати доступ до цих змінних, застосовується оператор крапка (.). Він пов'язує ім'я об'єкта з іменем змінної екземпляра. Наприклад, присвоїти змінній r об'єкта alkon значення 100 можна за допомогою оператора alkon.r = 100. Цією командою змінній r об'єкта alkon присвоюється значення 100.
Структура класу, що не містить коду. Розв’язок задачі. Після її збереження буде створено файл Коn.java. У програмі наведено разом класи Коn i Kon. Nom1. Їх можна ввести i зберегти кожний окремо з іменами Коn.java i Kon. Nom1.java. Але, зважаючи на те що класи уведені разом, під час компіляції кожний із них буде збережений у різних файлах. Запуск програмного коду здійснюється з файла Коn. Nom1, оскільки метод main міститься у цьому класі./*Програма обчислення об'єму конуса, у якій використовується клас Коn */class Kon { //Клас Коndouble r, h; //змінні екземпляра; r — радіус, h — висота}//У цьому класі оголошується об'єкт alkon класу Konclass Kon. Nom1 { public static void main(String args[]) {Kon alkon = new Kon(); //оголошено об'єкт alkon класу Kondouble vol; //змінна для обчислення об'єму конусаalkon.r = 10.5; //копія змінної екземпляра ralkon.h = 20;//копія змінної екземпляра hvol = alkon.h * (3.14 * alkon.r * alkon.r) / 3;//обчислення об'єму конуса. System.out.println("Об'єм конуса = "+ vol); //виведення об'єму конуса}Об’єм конуса=2307,9
Структура класу, що не містить коду. Перейдемо тепер до розроблення програмного коду для обчислення об'єму двох конусів із різними радіусами й висотами. Клас Коn не потрібно розробляти ще раз, тому що його уже створено, збережено в окремому файлі, і він задовольняє наші потреби. Але потрібно створити клас, наприклад, із іменем Kon. Nom2, що містить два об'єкти alkon1 (для першого конуса) i alkon2 (для другого конуса). На рис. 2.2 наведено зміст цього класу.
Структура класу, що не містить коду/*У цьому класі оголошуються два об'єкти класу Kon і обчислюються об'єми двох конусів*/class Kon. Nom21 public static void main(String args[]) {Коn alkon1 = new Kon(); //оголошення об'єкта alkon1. Коn alkon2 = new Kon(); //оголошення об'єкта alkon2double vol; //змінна для об'єму конусаalkon1.r= 15; //копія змінної екземпляра r об'єкта alkon1alkon1.h = 40; //копія змінної екземпляра һ об'єкта alkon1alkon2.r = 12; //копія змінної екземпляра r об'єкта alkon2alkon2.h = 30; //копія змінної екземпляра һ об'єкта alkon2vol = alkon1.h*(3.14 * alkon1.r* alkon1.r) / 3; //об'єм першого конуса. System.out.println("Об'єм першого конуса = "+ vol);vol = alkon2.h* (3.14 * alkon2.r * alkon2.r) / 3; //об'єм другого конуса. System.out.println("Об'єм другого конуса = " + vol);Рис. 2.2. Код обчислення об'єму двох конусів. Об’єм першого конуса=9420,0 Об’єм другого конуса=4532,5999999999
Структура класу, що не містить кодуІз наведеного коду видно, що в об'єктах alkon1 i alkon2 дані конусів відокремлені й мають різні значення. Звернемо також увагу на те, що класи Kon. Nom1 i Kon. Nom2 не пов'язані між собою, але обидва пов'язані з класом Kon. Недолік розглянутої програми очевидний об'єми кожного конуса обчислюються самостійно, тобто двічі повторюється обчислення об'єму конуса за однією формулою але для різних об'єктів. Цей недолік посилюється в разі збільшення кількості об'єктів. Наприклад, якщо потрібно обчислити об'єми 100 конусів, то необхідно сто разів написати одні й ті самі оператори для обчислення їх об'єму.
ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО ВИКОНАННЯ Розробіть програму для обчислення площі прямокутного трикутника з відомими катетами з використанням класу, що не містить методу. Розробіть програму з використанням класу, що не містить методу, для обчислення значення виразу y=(a^2-c)/(a+b). Розробіть програму з використанням класу, що не містить методу, для обчислення сторони рівностороннього трикутника, вписаного в коло з радіусом r. Розробіть програму для обчислення площ двох прямокутних трикутників із використанням класу, що не містить методу, для обчислення. Катети першого трикутника мають значення a=5, b=4, а другого – a=6, b=7.