Об’эктно оріэнтована мова програмування Java
Наразі немає особливої потреби переконувати когось в перевагах об’єктно-орієнтованого підходу до розробки програм. Не тільки створення великих проектів, а навіть розуміння того, як працюють сучасні операційні системи, неможливе без досконалого знання принципів об’єктно-орієнтованого програмування. Більше того, об’єктний стиль розробки програм став своєрідним правилом “хорошого тону” в світі програмістів. Між тим, так було далеко не завжди.
Чому ж багато народу з радістю витрачає службовий і вільний час на складання програм? Мабуть, одною з причин є швидкість, з якою в галузі програмування впроваджуються нові ідеї та технології. Завжди на горизонті є щось новеньке.
Мова Java, можливо, якнайкраще ілюструє попереднє твердження. Лише за кілька років Java пройшла шлях від концепції до однієї з найпопулярніших машинних мов.
Перша робоча версія мови, що носила назву “Oak”, з’явилася в компанії Sun Microsystems, Inc в 1991 році. Весною 1995 року, після внесення достатньо суттєвих змін, її було перейменовано в Java. Головним стимулом її створення була потреба в незалежній від платформи мові, яку можна було б використовувати для розробки програмного забезпечення різноманітних електронних пристроїв: комп’ютерів, мобільних телефонів, мікрохвильових печей тощо. Бурхливий розвиток Інтернет став додатковим фактором, що сприяв популярності Java, оскільки також вимагав розроблення програм, що легко переносяться.
Створення мови Java – це один із самих значних кроків вперед в області розробки середовищ програмування за останні 20 років. HTML (Hypertext Markup 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(), russian 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 – це об’єктно орієнтована мова програмування, яка пропонує легкість в програмуванні на високому рівні.