Об’эктно оріэнтована мова програмування Java

Наразі немає особливої потреби переконувати когось в перевагах об’єктно-орієнтованого підходу до розробки програм. Не тільки створення великих проектів, а навіть розуміння того, як працюють сучасні операційні системи, неможливе без досконалого знання принципів об’єктно-орієн­тованого програмування. Більше того, об’єктний стиль розробки програм став своєрідним правилом “хорошого тону” в світі програмістів. Між тим, так було далеко не завжди.

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

Мова Java, можливо, якнайкраще ілюструє попереднє твердження. Лише за кілька років Java пройшла шлях від концепції до однієї з найпопулярніших машинних мов.

Перша робоча версія мови, що носила назву “Oak”, з’явилася в компанії Sun Microsystems, Inc в 1991 році. Весною 1995 року, після внесення достатньо суттєвих змін, її було перейменовано в Java. Головним стимулом її створення була потреба в незалежній від платформи мові, яку можна було б використовувати для розробки програмного забезпечення різноманітних електронних пристроїв: комп’ютерів, мобільних телефонів, мікрохвильових печей тощо. Бурхливий розвиток Інтернет став додат­ковим фактором, що сприяв популярності Java, оскільки також вимагав розроблення програм, що легко переносяться.

Створення мови Java – це один із самих значних кроків вперед в області роз­робки середовищ програмування за останні 20 років. HTML (Hypertext Mark­up Language – мова розмітки гіпертексту) був необхідний для статичного розміщення сторінок у “Всесвітній павутині” WWW (World Wide Web). Мова Java потрібна була для якісного стрибка в створенні інтерактивних продуктів для Internet.

Багато властивостей Java отримав від C і C++. Проектувальники Java свідомо пішли на це, оскільки знали, що знайомий синтаксис зробить мову привабливою для легіонів досвідчених програмістів C і C++. В той же час між Java і C++ існують суттєві практичні та філо­софські відмінності. Неправильно вважати Java і вдосконаленою версією мови C++, розробленою з метою її заміни. Це – різні мови, кожна з яких вирішує своє коло проблем. Принципи об’єктно-орієнтованого програмування, втілені в C++, були розширені та вдосконалені в Java.

Ще один важливий аргумент на користь Java – відсутність потреби в наявності ліцензії на її використання. Хоча сторонні виробники про­по­нують платні інструментальні середовища для розробки та відлагодження Java-програм, на Webсервері фірми Sun http://java.sun.com завжди можна знайти та завантажити "рідний" безкоштовний варіант компілятора Java (Java Development Kit) разом з усім необхідним для створення програм.

Розглянемо, що таке об’єктно-орієнтоване програмування. Як ми знаємо, всі комп’ютерні програми складаються з двох елементів: коду та даних. Відповідно будь-яка програма може бути концептуально організована або навколо її коду, або навколо її даних. Іншими словами, деякі програми концентрують свою увагу на тому, “що робиться з даними”, а інші – на тому, “на що цей процес впливає”.

Існує декілька парадигм (ключових підходів), які управляють конструюванням програм. Перший підхід вважає програму моделлю, орієнтованою на процес (process-oriented model). При цьому програму визначають послідовності операторів її коду.

Перші компілятори (на­прик­лад, FORTRAN) підтримували проце­дур­ну модель програмування, в основі якої лежить використання функцій. Наступний етап розвитку пов’язаний з переходом до стуктурної моделі програмування (до неї відносяться компілятори ALGOL, Pascal, C), в основі якого лежать такі положення: про­грами представляються у ви­гля­ді сукупності взаємопов’язаних про­це­дур і даних, якими ці процедури (або бло­ки) оперують. Тут широко використовуються процедурні блоки і міні­мальне використання GOTO. Ці програми є більш прості. Такі мови про­гра­­мування, як Pascal, C успішно використовують цю модель. Але тут часто виникають проблеми, коли зростає розмір і складність програм.

Інший підхід, названий об’єктно-орієнтованим програмуванням (ООП), було створено для управління зростаючою складністю програм. ООП організує програму навколо її даних (тобто навколо об’єктів) і набору чітко визначених інтерфейсів з цими даними. Об’єктно-орієнтовану про­граму можна характеризувати як доступ до коду, що управляється даними (data controlling access to data). Як ми побачимо далі, такий підхід має деякі організаційні переваги, а саме: можна повторно використовувати код програми і таким чином економити час на розробку.

1. Програми з використанням ООП добре структуровані, що дозволяє добре розуміти, які функції виконують окремі підпрограми.

2. Програми з використанням ООП легко тестувати і модифікувати. Мож­на розбити програму на компоненти і тестувати роботу кожної з них.

Всі мови ООП забезпечують механізми, які допомагають реалізувати об’єктно-орієнтовану модель. До них відносять абстракцію, інкапсуляцію, успад­ку­ван­ня і поліморфізм. Також їх часто називають основними принципами ООП.

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

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

Основою абстракціі та інкапсуляції в Java є клас. Клас визначає струк­­туру та поведінку (дані і код) деякого набору об’єктів. Кожен об’єкт заданого класу містить як структуру (дані), так і поведінку, що визна­чається класом (так, як би ці об’єкти було проштамповано шаблоном у формі класу). Тому об’єкт іноді ще називають екземпляром класу. Таким чином, клас – це логічна конструкція, а об’єкт – це фізична реальність.

При створенні класу необхідно специфікувати код і дані, що складають цей клас. Разом всі ці елементи називають членами (members) класу. Дані, що визначаються в класі, називають змінними-членами (member variables), або полями класу. Код, який оперує з цими даними (тобто функції, що зна­хо­дяться в середині класу), називають методами-членами (member methods), або просто методами. В правильно записаних Java-програмах методи визна­чають, як можна використовувати змінні-члени. Отже, поведінку та інтер­фейс класу визначають методи, що оперують з даними його екземплярів.

Оскільки мета створення класу – це інкапсуляція складності, існують механізми приховування її реалізації в середині класу. Методи і поля класу можуть бути помічені як private (приватний, локальний) або public (загаль­ний). Модифікатор public вказує на все, що потрібно знати зовнішнім користувачам класу. Методи та поля з модифі­ка­то­ром private є доступними лише для методів даного класу. Будь-який код, що не є членом даного класу, не має доступу до private-методів і полів. Ос­кільки private-члени класу є доступними для інших частин програми тільки через public-методи класу, можна бути впевненим, що ніякі непотрібні дії не виконуються.

Успадкування (наслідування) – це процес, за допомогою якого один об’єкт отримує властивості іншого об’єкта. Воно важливе, тому що під­тримує концепцію ієрархічної класифікації. Переважною частиною знань можна управляти лише за допомогою ієрархічних (тобто організованих “згори донизу”) класифікацій. Без застосування класифікацій кожен об’єкт потребував би явного визначення всіх своїх характеристик. Завдяки вико­рис­танню ус­пад­кування об’єкт потребує визначення лише тих якостей, які роблять його уні­кальним у власному класі. Тому саме механізм успад­кування дає мож­ли­вість одному об’єкту бути специфічним екземпляром загального випадку.

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

Якщо ми захочемо описати більш специфічний клас тварин, такий як ссавці, вони повинні були б мати більш специфічні атрибути, такі як тип зубів і молочні залози. Такий клас відомий як підклас тварин, тоді як клас тварин називають суперкласом (батьківським класом, класом-пращуром).

Поліморфізм (грецькою ”polymorphos” – множинність форм) – влас­ти­вість, яка дозволяє використовувати один інтерфейс для спільного класу дій. Специфічна дія точно визначається в залежності від конкретної ситу­а­ції. Наприклад, розглянемо стек (список типу LIFO – Last-In, First-Out; ос­тан­нім увійшов, першим вийшов). Програма може потребувати три типи стеків. Один стек використовується для цілих чисел, другий – для чисел з плаваючою крапкою, третій – для символів. Алгоритм, який реалізує кожен стек, один і той самий, хоча дані, що зберігаються, різні. Не об’єктно-орієнтована мова вимагала б створення трьох різних стекових підпрограм, кожна з яких мала б своє власне ім’я. Завдяки поліморфізму в мові Java можна визначити спільний для всіх типів даних набір стекових підпрограм, що використовують одне і те саме ім’я.

При правильному застосуванні наведені принципи ООП – абстракція, інкапсуляція, поліморфізм та успад­ку­вання – взаємодіють таким чином, щоб створити деяке середовище програмування, яке має забезпечити більш стійкі та масштабовані програми порівняно з моделлю, орієнтованою на процеси. Вдало спроектована ієрархія класів є базисом повторного використання коду, для створення та тестування якого було витрачено чимало часу та зусиль. Інкапсуляція дозволяє реалізаціям подорожувати в часі без руйнування коду, доступ до якого здійснюється з допомогою public-інтер­фейса класів. Поліморфізм дозволяє створювати ясний та читабельний код.

Мова Java – це об’єктно-орієнтована мова програмування, що веде свою історію від відомої мови C++. Але, на відміну від останньої, Java є мовою, що інтерпретується. Програми, написані на ній, здатні працювати в різних місцях мережі і не залежать від платформи, на якій виконуються написані на ній додатки. Java свідомо уникає арифметики з покажчиками й іншими ненадійними еле­ментами, якими буяє C++, тому, розробляючи на ній додатки, ми позбавляємося багатьох проблем, звичайних при створенні програмного забезпечення.

Для відлагодження програм мовою Java підійде будь-який з пакетів: Microsoft Visual J++, Symantec Cafe, Java Add-On зі складу Borland C++ 5.0 чи Sun Java WorkShop. Якщо є бажання користуватися командними файлами, то можна завантажити з Web-сервера http://java.sun.com "рідний" варіант компілятора Java компанії Sun – Java Development Kit (JDK).

У термінах мови Java маленький додаток, що вбудовується в сторінку Web, називається аплетом. Власне кажучи, створення аплетів – основне застосування для Java. Аплети здобули собі звання справжніх прикрас для Web. Аплет може бути і вікном анімації, і електронною таблицею, і усім, що тільки можна собі уявити. Але це не означає, що на Java не можна писати нормальні додатки з вікнами. Ця мова програмування споконвічно була створена для звичайних додатків, що виконуються в Internet і в інтра­мережах, і вже потім стала використовуватися для виготовлення аплетів.

Елементарні будівельні блоки в Java називаються класами (як і в C++). Клас складається з даних і коду для роботи з ними. У засобах для розробки мовою Java усі стандартні класи, доступні програмісту, об'єднані для зручності в пакети – ще одні елементарні блоки Java-програм.

На рисунку 2.1 схематично представлено основні етапи створення додатку за допомогою стандартних засобів JDK. Запустимо компілятор Java з назвою javac і отримаємо готовий клас Java – Hello.class:
javaс Hello.java

 

Компілятор javac генерує окремий файл для кожного класу, визначеного у файлі вихідного тексту, незалежно від кількості файлів вихідного тексту. Якщо хочемо подивитися, як цей додаток працює, виконаємо його за допомогою команди «java Hello».

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

Розглянемо поелементно вихідний текст нашого прикладу. Вся програма складається з одного класу з ім'ям Hello. У цьому класі є єдиний метод main(), аналогічний функції main() у мовах програмування C і C++, який і визначає місце, з якого програма починає виконуватися (так звана точка входу). Модифікатор доступу public перед ім'ям методу main() вказує на те, що цей метод доступний усім класам, що бажають його викликати, незалежно від прав доступу і від місця їхнього розташування. Модифікатор static говорить про те, що для всіх екземплярів класу Hello і в наслідуваних від нього класах існує лише один метод main(), поділюваний між усіма класами, що, можливо, будуть успадковані від Hello. Це допомагає уникнути появи безлічі точок входу в програму, що викликає помилку.

Через змінну-масив args типу String (рядок) передаються параметри командного рядка класу. У Java перший елемент списку параметрів відповідає першому параметру, а не імені програми, що запускається, як це прийнято в мовах C і C++. Доступ до нього можна здійснити через вираз args. Рядок System.out.println ("Hello, World!") посилає рядок тексту в стандартний потік виведення, тобто на екран. Ми відправляємо повідомлення стандартному класу System, що відповідає за основні системно-незалежні операції, наприклад, виведення тексту на консоль. А вже з цього класу ми викликаємо клас стандартного потоку виведення. Слідом йде виклик методу println(), що, власне, і відображає рядок тексту на екрані монітора, по завершенню чого переводить курсор на наступний рядок.

У Java всі методи класу описуються тільки в середині цього класу. Таким чином, відпадає необхідність у пересуванні по тексту в пошуку методів класів.

Якщо засвоїти вміст пакету Java з ім'ям java.awt, що розшифровується як Abstract Windowing Toolkit (Набір абстрактної роботи з віконною системою), то відкриються незлічимі можливості по створенню інтерфейсів і віконної графіки. Цей пакет забезпечує машинно-незалежний інтерфейс керування віконною системою будь-якої віконної операційної системи. До складу java.awt входять більше 40 класів, що відповідають за елементи гра­фічного середовища користувача (GUI). В основному awt застосовується при написанні аплетів для сторінок Web. При перегляді сторінки на Web-сервері аплет передається на машину користувача, де і запускається на виконання.

Першим рядком в аплет включаються всі необхідні класи з пакету java.awt, про який ми тільки що говорили. Ключове слово import має приблизно те ж значення, що й оператор #include мов C і C++. Далі слідує опис класу нашого аплета, якому передує модифікатор доступу public. Його задача – дати можливість використовувати наш клас ззовні, тобто запускати його з зовнішніх програм. Якщо цього слова не буде, компілятор видасть повідомлення про помилку, указавши, що аплету потрібно опис інтерфейсу доступу. Далі йде ключове слово extends і назва класу. Так у Java по­значається процес успадкування. Цим словом ми вказуємо компілятору успадкувати (розширити) стандартний клас java.applet.Applet, відпо­ві­дальний за створення і роботу аплета. Метод init() викликається в процесі ініціалізації аплета. Зараз цей метод порожній, але згодом, можливо, ми скористаємося ним для своїх цілей. За відображення рядка відповідає інший метод – paint(). Він викликається в той момент, коли потрібно перемалювати дані на екрані. Тут за допомогою методу drawString() стандартного класу Graphics малюється рядок "Hello, Java!" з екранними координатами (20, 30).

Опишемо базові типи даних. Ідентифікатори мови Java повинні починатися з букви будь-якого регістра або символів "_" і "$". Далі можуть йти і цифри. Наприклад, _Java - правильний ідентифікатор, а 1_$ - ні. Ще одне обмеження Java виникає з його властивості використовувати для збереження символів кодування Unicode, тобто можна застосовувати тільки символи, що мають порядковий номер більш 0x0 у розкладці символів Unicode.

Коментарі. У стандарті мови Java існує три типи коментарів:

/*Comment*/ //Comment /** Comment*/

Перші два являють собою звичайні коментарі, застосовувані як у Java, так і в C++. Останній – особливість Java, введена в цю мову для авто­ма­тич­но­го документування. Після написання вихідного тексту утиліта авто­ма­тичної генерації документації збирає тексти таких коментарів в один файл.

Цифрові літерали схожі з аналогічними в мові C++. Правила для цілих чисел прості:

- якщо в цифри немає суфікса і префікса, то це десяткове число;

- у вісімкових числах перед цифрою стоїть нуль;

- для шістнадцяткових чисел префікс складається з нуля і букви X (0x чи 0X).

- при додаванні до цифри букви L числу присвоюється тип long (довге ціле).

Числа із плаваючою крапкою.

Цілочисельні типи. У мові Java з'явився новий 8-бітний тип byte. Тип int, на відміну від аналогічного в C++, має довжину 32 біти. А для 16-бітних чисел передбачений тип short. У відповідності з усіма цими змінами тип long збільшився, ставши 64-бітним.

Таблиця 2.1

Чисельні типи даних

Тип Форма представлення Значення за замовчу­ванням Довжина (в бітах) Максимальне значення
byte Ціле число зі знаком
short Ціле число зі знаком
int Ціле число зі знаком
long Ціле число зі знаком порядку 1018
float Число з плаваючою точкою порядку 1038
double Число з плаваючою точкою порядку 10308

 

У стандарт Java був введений тип boolean, якого так довго чекали програмісти, що використовують C++. Він може приймати лише два значення: true і false.

У порівнянні з C++ масиви Java перетерпіли значні зміни. По-перше, змінилися правила їхнього опису. Масив тепер може бути описаний двома такими способами:

type name[];

type[] name;

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

char[] arrayName;

arrayName[] = new char[100];

або сполучити опис масиву з виділенням під нього пам'яті:
char array[] = new char[100];

Багатомірних масивів у Java немає, тому доводиться вдаватися до хитрощів. Наприклад, створити багатомірний масив можна як масив масивів:
float matrix[][] = new float[5][5];

Класи:

Говорячи про класи, необхідно ще раз пригадати один з трьох основних принципів ООП – успадкування. Використовуючи його, можна створити головний клас, який визначає властивості, спільні для набору елементів. Надалі цей клас може бути успадкований іншими, більш специфічними класами. Кожен з них додає ті властивості, які є унікальними для нього. В термінології Java клас, який успадковується, називається суперкласом (superclass). Клас, який виконує успадкування, називається підкласом (subclass). Тому підклас – це спеціалізована версія суперкласу. Він успадковує всі поля та методи суперкласу, та додає до них свої власні унікальні елементи. Щоб успадкувати клас, необхідно просто ввести визначення одного класу в інше, використовуючи ключове слово extends.

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

Модифікаторів доступу є три плюс ще один за замовчуванням.
public – класи public доступні для всіх об’єктів незалежно від пакета, тобто повністю не захищені. public-класи мають знаходитися в файлах з іменами, що збігаються з іменами класів.

friendly – значення за замовчуванням (тобто слово friendly в описі класу ніколи не пишеться!). friendly-класи доступні лише для об’єктів, що знаходяться в тому ж самому пакеті, що і даний клас, незалежно від того, чи є вони нащадками даного класу.

final-класи не можуть мати підкласів-нащадків. Тим самим ми втра­ча­ємо одну з головних переваг ООП. Але іноді треба заборонити іншим класам змінювати поведінку розроблюваного класу (наприклад, якщо даний клас буде використаний як стандарт для обслуговування мережних комунікацій).

abstract – це клас, в якому є хоча б один абстрактний метод, тобто метод, для якого описаний лише заголовок (прототип функції), а саме тіло методу відсутнє. Зрозуміло, що реалізацію цього відсутнього методу покла­де­но на класи-нащадки. Наприклад, створюється деякий клас для перевірки орфографії. Замість того, щоб закладати в нього перевірку української, ро­сійської, англійської орфографії, створюючи методи ukraineCheck(), russi­an Check() і т. д. можна просто створити абстрактний метод grammarCheck(), перекладаючи роботу щодо перевірки конкретної граматики на класи-нащадки (які, можливо, будуть створені іншими фахівцями).

Можливість створення класів-нащадків – одна з головних переваг ООП. Для того, щоб використати вже існуючий клас слід указати в об’яві класу слово extends (розширює). Наприклад,
public class MyClass extends Frame.

В основі ієрархії в java знаходиться клас Object. Тому якщо навіть не використовується слово extends в описі класу, то створюється нащадок класу Object.

Нагадаємо, що клас-нащадок успадковує всі дані та методи суперкласу. В мові java відсутнє множинне успадкування (але є інтерфейси, які з успіхом замінюють його).

Чому в Java немає множинного успадкування? Це не випадково, тут спостерігається певна система. В мові Java розробники вирішили позбавитись від всього, що могло викликати проблеми в C++, наприклад, покажчики, множинна спадковість.

Конструктори. Створення екземплярів класу:

Конструктор – це метод класу, що має особливе призначення. Зокре­ма він використовується для установки деяких параметрів (наприклад, ініці­а­лі­зації змінних) та виконання певних функцій (наприклад, виділення пам’яті).

Конструктор має те ж саме ім’я, що і клас. Наприклад,
MyClass(String name) {myName=name;}

Як відрізнити – це клас чи конструктор?
MyClass MyClass()

Так само, як в C++, один клас може мати декілька конструкторів. У цьому випадку вони мають відрізнятися за своїми параметрами. Також в описі конструктору можна використовувати модифікатори доступу, але не всі. Найчастіше конструктори роблять public.

В класах існують два типи змінних: одні належать самому класу, інші ж – різним методам класу.

Ті змінні, що описані не в методах, але в середині даного класу, називають полями класу. Вони доступні для всіх методів даного класу (це як мінімум).

Крім того, можна описувати змінні в середині метода класу. Такі змінні є локальними для метода і доступні тільки для цього метода.

Загальне правило: кожна змінна доступна лише в середині того блока (обмеженого фігурними дужками), в якому її описано.

І останнє. Як поля, так і локальні змінні можуть бути як базового типу, так і екземплярами класу.

В таблиці 2.2 наведено правила доступу до полів і методів, описаних за допомогою різних модифікаторів. Елемент, описаний public, доступний з будь-якого місця. Все, що описано private, доступно лише в середині класа. Якщо у елемента взагалі не указаний модифікатор рівня доступу, то такий елемент буде видно з підкласів-нащадків і класів того ж пакета. Саме цей рівень доступу використовується в Java за замовчуванням. Якщо треба зробити, щоб елемент крім того був доступний зовні пакета, але тільки підкласам того ж класа, якому він належить, його слід описати як protected. І, на сам кінець, якщо треба щоб елемент був доступний тільки під­класам, незалежно від того, чи знаходяться вони в даному пакеті, використовуйте комбінацію private protected.

Таблиця 2.2

Доступ до полів і методів для різних модифікаторів

  private friendly (модифікатор відсутній) private protected protected public
той же клас + + + + +
підклас в тому ж пакеті - + + + +
незалежний клас в тому ж пакеті - + - + +
підклас в іншому пакеті - - + + +
незалежний клас в іншому пакеті - - - - +

 

З полями та методами можуть використовуватись всі специфікатори доступу, з класами – лише public і значення за замовчуванням.

Модифікатор static. Цей описувач може використовуватись як з полями, так і з методами. Для поля описувач static означає, що таке поле створюється в єдиному екземплярі незалежно від кількості об’єктів даного класу (звичайні поля – для кожного екземпляру класу). Статичне поле існує навіть тоді, коли немає жодного екземпляра класу. Статичні поля розташовуються Java-машиною окремо від об’єктів класу в момент першого звертання до цього класу.

Розглянемо найбільший і, напевно, самий корисний розділ мови Java, зв'язаний з реалізацією користувацького інтерфейсу. Для цього необхідно вивчити базові класи пакету java.awt (Abstract Window Toolkit), представлені на рисунку 2.3.

TextComponent
TextField
TextArea
Container
Panel
Window
Frame
Dialog
File Dialog
Applet
Component
Canvas  
List
Label
Button
Checkbox
Choice
Scrollbar
Menu Component
MenuBar
MenuItem
Menu
CheckboxMenuItem

 


Рисунок 2.3 – Ієрархія класів пакету java.awt

Отже, що ж таке awt? Це набір класів Java, кожний з яких відповідає за реалізацію функцій і відображення того чи іншого елемента графічного інтерфейсу користувача (GUI). Практично всі класи візуальних компонентів є нащадками абстрактного класу Component. Лише візуальні елементи меню успадковуються від іншого класу – MenuComponent. Керуючі елементи представлені такими класами: Button (кнопка), Checkbox (кнопка з неза­леж­ною фіксацією), Choice (список Windows), Label (рядок), List (список вибору Windows) і Scrollbar (смуга прокручування). Це досить прості класи, успадковані від абстрактного класу Component безпосередньо.

Однак у складі java.awt є класи інтерфейсних елементів, що мають проміжного пращура. Гарним прикладом тому є клас Panel для створення різних панелей. У нього є проміжний абстрактний клас-пращур Container, що слугує родоначальником багатьох класів-контейнерів, здатних містити в собі інші елементи інтерфейсу. Від цього ж класу успадковується клас вікна Window, що представляє на екрані найпростіше вікно без меню і рамки. У цього класу є два часто використовуваних нащадки: Dialog, назва якого говорить сама за себе, і Frame – стандартне вікно Windows. Ще один проміжний клас TextComponent породжує два корисних у роботі класи – TextField (аналог рядка введення Windows) і багаторядкове вікно текстового введення TextArea. Особняком від всіх елементів стоїть клас Canvas. Його візуальне представлення – порожній квадрат, на якому можна виконувати малювання і який може обробляти події натиснення кнопок миші.

Від свого батьківського класу Component всі візуальні елементи переймають загальну для них усіх поведінку, пов'язану з їх візуальною та функціональною сторонами. Наведемо список основних функцій, що їх виконують всі компоненти, та методів для їх реалізації.

Таблиця 2.3

Основні методи класу Component

Назва методу Функціональне призначення
getFont() setFont() getFontMetrics() визначає або встановлює шрифт компонента
setForeground() getForeground() установлення і зчитування кольору компонента
setBackground() getBackground() установлення і зчитування кольору тіла компонента
preferredSize() minimumSize() повертають менеджеру розкладок інформацію про кращий і мінімальний розміри компонента, відповідно
resize() size() встановлює і визначає розміри компонента
show() hide() показує та приховує компонент
isVisible() isShowing() повертає true, якщо компонент відображений, і значення false, якщо компонент прихований
disable() enable() забороняє або дозволяє компонент
isEnable() повертає true, якщо компонент дозволений
paint() update() repaint() відображення компонента
handleEvent() action() обробка повідомлень
keyDown() keyUp() обробка повідомлень клавіатури

Label (Текст):

За допомогою класу Label можна створювати текстові рядки у вікні Java-програм і аплетів. Для створення об’єкту цього типу існують три види конструкторів:

Label(); // створюється пустий рядок

Label(String str); // надпис, вирівняний вліво

Label(String str, int align); // надпис із заданим вирівнюванням

де змінна align може приймати три значення: Label.LEFT, Label.CENTER, Label.RIGHT.

Таблиця 2.4

Основні методи класу Label

SetText(String str) змінює текст в рядку
setAlignment(int align) змінна вирівнювання
String getText() повертає текст рядка
int getAlignment() повертає значення вирівнювання

Приклад:

Label MyLabel1 = new Label(“Надпис по центру”, Label.CENTER);

Label MyLabel2 = new Label(“Вирівняний вліво”);

Клас Button представляє на екрані кнопку. У цього класу є два типи конструктора. Перший з них створює кнопку без надпису, другий – з надписом:

Button(); // кнопка без тексту на ній

Button(String str); // кнопка із текстом на ній

Корисні методи:

setLabel() – створити або замінити надпис на кнопці;

getLabel() – дізнатись про надпис на кнопці.

Обробка кнопок. При натисненні на кнопку викликається метод action():

public boolean action(Event evt, Object wA);

де evt – подія, яка відбулася (evt.target – до якого об’єкту відноситься

подія, evt.when – час виникнення події, ...);

wA – текст надпису на кнопці.

Таблиця 2.5

Основні методи класу Checkbox

boolean getState() метод класу Checkbox, що повертає статус прапорця
getCurrent() метод класу CheckboxGroup, повертає перемикач, який в даний момента включений
SetCurrent() встановлює активну кнопку перемикача (для класу CheckboxGroup)
setLabel() getLabel() встановлює або повертає текст при прапорці або перемикачі

Обробка перемикачів та прапорців. При натисканні мишею по прапорцю або перемикачу викликається метод action(), другий параметр якого wA є об’єктом класу boolean, який має значення true, якщо прапорець встановлено, і false – в протилежному випадку.

Коли потрібно створити список, що розкривається, можна вдатися до допомоги класу Choice. Створити його можна за допомогою конструктора
Choice();

Таблиця 2.6

Основні методи класу Choice

addItem(String str) Додати елемент в список
select(int n) Вибрати рядок з визначеним номером
select(String str) Вибрати визначений рядок тексту зі списку
int countItems() повернути кількість пунктів у списку
int getSelectIndex() повертає номер вибраного рядка (нумерація починається з 0)
String getItem(int n) повернути рядок з визначеним номером у списку
String getItem() повернути вибраний рядок

Обробка списків, що розкриваються. При виборі елемента списку викликається метод action(), другий параметр wA якого містить в собі назву вибраного елемента.

Клас List (список) за призначенням дуже схожий на клас Choice, але надає користувачу не такий список, що розкривається, а вікно зі смугами прокручування, в середині якого знаходяться пункти вибору. Будь-який з цих пунктів можна вибрати подвійним щигликом або, вказавши на нього мишею, натиснути клавішу <Enter>. Причому можна зробити так, що стане можливим вибір декількох пунктів одночасно.

Таблиця 2.7

Основні методи класу List

addItem(String str) додати рядок до списку;
addItem(String str, int index) вставити рядок в список в позицію index (якщо index = -1, то додається в кінець списку);
replaceItem(String str, int index) замінити елемент вибору в зазначеній позиції
delItem(int index) видалити зі списку визначений пункт
delItems(int start, int end) видалити елементи вибору з номерами, що входять в інтервал від номера start до номера end;
getItem(int n) текст пункту вибору
clear() очистити список (знищити всі елементи списку відразу)
select(int n) виділити пункт із визначеним номером
deselect(int n) зняти виділення з визначеного пункту
isSelected(int n) повернути значення true, якщо пункт із зазначеним номером виділений, інакше повернути false
countItems() порахувати кількість пунктів вибору в списку
getRows() повернути кількість видимих у списку рядків вибору
getSelectedIndex() довідатися порядковий номер виділеного пункту; якщо повертається -1, те обрано кілька пунктів (метод для списків І типу)
getSelectedItem() прочитати текст виділеного пункту вибору (для списків І типу);
int[] getSelectedIndexes() повернути масив індексів виділених пунктів (для списків ІІ типу);
String[] getSelectedItems() повернути масив рядків тексту виділених пунктів (для списків ІІ типу)
allowsMultipleSelections() повернути true, якщо список дозволяє множинний вибір
setMultipleSelections() включити або виключити режим дозволу множинного вибору

Створення об'єкта класу List може відбуватися двома способами. Ви можете створити порожній список і додавати в нього пункти, викликаючи метод addItem(). При цьому розмір списку буде рости при додаванні пунктів. Інший спосіб дозволяє відразу обмежити кількість видимих у вікні списку пунктів. Інші пункти вибору можна побачити, прокрутивши список.

Обробка списків. Клас List не використовує метод action(). Замість нього використовується метод

handleEvent(Event evt);

де evt– статична константа, що приймає одне з двох значень:

LIST_SELECT – елемент вибраний;

LIST_DESELECT – не вибраний;

Таблиця 2.8

Основні методи класів TextField і TextArea

Спільні методи для обох класів
getText() зчитати текст
setText(String) відобразити текст;
select(int, int) виділити текст між початковою і кінцевою позиціями;
selectAll() виділити весь текст
getSelectedText() прочитати виділений текст;
SetEditable(Boolean) заборонити редагування тексту
isEditable() перевірити, чи дозволене редагування тексту
getSelectionStart() повернути позицію початку виділення
getSelectionEnd() повернути позицію закінчення виділення
getColumns() повернути кількість видимих символів у рядку редагування (не довжина рядка!)

Обробка повідомлень текстового рядка та текстового поля. Як і клас List, клас TextArea не використовує метод action(). Оскільки події цього класу – це події клавіатури і миші, тому краще створити додаткову кнопку, яку користувач міг би натиснути, вказуючи, що введення завершено. Після цього можна застосувати метод getText() для отримання результату введення і редагування.

Методи, які додають або вилучають блоки прослуховування, забез­печуються джерелом, що генерує подію. Наприклад, клас Component забезпечує методи для додавання та вилучення блоків прослуховування подій клавіатури та миші.

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

Методи, що приймають і обробляють події, визначені в наборі інтерфейсів, що знаходяться в пакеті java.awt.event. Наприклад, інтерфейс MouseMotionListener визначає два методи для приймання повідомлень про події перетягування та пересування миші. Будь-який об’єкт може приймати та обробляти одну або обидві ці події, якщо він забезпечує реалізацію цього інтерфейса. [16]

Висновки доІІрозділу

Технологія Javа є дуже перспективною для застосування в розробках неокомерційного та комерційного спрямування. Легкість програмування на Java, та кросплатформенність цієї мови, робить її найпоширенішою в світі серед програмістів. На Java можна створити програми будь-якої складності, a модифікатори доступу зможуть захистити код від зовнішнього втручання.

Мову програмування Java було обрано для написання нового алгоритму шифрування через те, що "написане один раз працює скрізь" (кросплатформність), один і той же написаний код буде працювати, наприклад і на Windows, і на Linux, і на MacOs. Тоді як на інших мовах програмування потрібно написати не 1, а відразу 3 різних коди – під Windows, під Linux і під MacOs. В Java дружній синтаксис:розробники мови Java взяли все найкраще від мови програмування С – і його прямого спадкоємця – мови програмування С ++, викинули все, що вважали зайвим і неособливо вдалим у С і С ++, внесли нововведення в нову мову програмування Java. A також через те, що Java – це об’єктно орієнтована мова програмування, яка пропонує легкість в програмуванні на високому рівні.