Розробка уроку

Тема: елементи мови Java для подійно-орієнтованого програ­мування.

Мета: всебічно ознайомитися із елементами мови Java для подійно-орієнтованого програмування.

Після вивчення матеріалу учень має:

Обладнання: комп’ютери зі встановленими ОС, JDK (Java Developer Kit, комплект розроб­ника Java) та середовищем програмування мовою Java. Наприклад, Eclipse чи Netbeans, для яких подано опис створення програми.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Вивчення нового матеріалу.
  4. Закріплення вивченого матеріалу.
  5. Підведення підсумків уроку.
  6. Домашнє завдання.

Хід уроку

1. Організаційний момент
Привітання з учнями. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання. Оголошення теми й мети уроку.

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

Структура програми мовою Java
Мова Java є статично типізованою. Програми на Java утворені з визначень класів та інтерфейсів. Класи містять змінні та сталі, які утримують дані, методи, які виконують дії, та конструктори, які створюють екземпляри класів — об'єкти. Дані можуть мати простий тип (наприклад байт, ціле число, символ) або бути посиланням на об'єкт.

public class Назва{
  public static void main (String []args) {
    тіло функції;
  }
}

Відомий приклад програми мовою Java:

public class HelloWorld {
  public static void main (String []args) {
    System.out.println ("Hello, World!");
  }
}

3. Вивчення нового матеріалу

Подійно-орієнтоване програмування (англійською event-driven programming, далі ПОП) — підхід до програмування, в якому виконання програми визначається подіями — діями користувача (наприклад, з клавіатурою, мишею, джойстиком тощо), повідомленнями інших програм і потоків, подіями операційної системи (наприклад, надходженням мережевого пакета).

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

Подійно-орієнтоване програмування, як правило, застосовують у таких трьох випадках:

У сучасних мовах програмування події та обробники подій є центральною ланкою реалізації графічного інтерфейсу користувача. Розглянемо, наприклад, взаємодію програми з подіями, породженими діями з мишею. Натискання правої клавіші миші викликає системне переривання, що запускає певну процедуру всередині операційної системи. У цій процедурі буде проведено пошук вікна, що перебуває під вказівником миші, для того, щоб дану подію надіслати в чергу опрацювання повідомлень цього вікна. Далі, залежно від типу вікна, можуть бути породжені додаткові події. Наприклад, якщо вікно є кнопкою (у Windows всі графічні елементи є вікнами), то додатково буде породжено подію натискання на кнопку. Відмінність останньої події у тому, що вона не містить координат вказівника, а говорить лише про те, що було натиснуто на цю кнопку.

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

Подійно-орієнтоване програмування тісно повязане з поняттям подійно-орієнтованої архітектури, де визначено й саму подію.

Подійно-орієнтована архітектура (англійською Event-driven architecture, EDA) — шаблон архітектури програмного забезпечення, який призначено для створення подій, їх виявлення, споживання і реагування на них.

Розробка застосунків і систем в подійно-орієнтованій архітектурі дозволяє конструювати їх найефективнішим способом.

Подійно-орієнтована архітектура (EDA) може доповнювати сервісно-орієнтовану архітектуру (SOA), бо активування сервісів (служб) має викликатися настанням певних подій. Обчислювальна техніка та сенсорні пристрої (сенсори, датчики, контролери) можуть виявляти зміни стану об'єктів і створювати події, які потім можуть бути опрацьовані сервісом (службою) або системою.

Структура події. Подія може складатися з двох частин: заголовка події та тіла події.

Заголовок події може включати в себе назвe події, часова мітка події і тип події.

Тіло подіїце частина, яка описує факт, що стався в дійсності.

Генератор подій виявляє цей факт і подає його подією в рамках виконання програми. Генератором може бути клієнт електронної пошти, система електронної комерції або датчика.

Канал подійце механізм, через який повідомлення від генератора подій передають до обробника подій (event engine).

Каналом подій може бути з'єднання TCP/IP або вхідний файл будь-якого типу. В один і той самий час може бути відкрито кілька каналів подій, які потрібно зчитувати асинхронно і які зберігають у черзі очікування на опрацювання.

Механізм опрацювання подій (event processing engine) є місцем, де подію ідентифікують і вибирають відповідь на неї.

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


Аплет (англійською Applet) — коротка комп'ютерна програма, що функціонально розширює можливості основної програми, або інтернет-застосунку (наприклад, додає на веб-сторінку анімацію). Для створення аплетів використовують (у тому числі) мову програмування Java.

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

Підкласи Component:

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


Події, породжені діями з мишею — тип MouseEvent:

Події, породжені діями з клавіатурою — тип KeyEvent:

Код події натискання клавіші — тип int — вказує на те, яку клавішу натиснуто.

Для події е його отримують як значення e.getKeyCode().

Код події для клавіш керування вказівником (зі стрілочками):

Вичерпний перелік назв кодів зі стислими коментарями англійською мовою для деяких з них подано в описі класу KeyEvent на сайті Oracle.

Для роботи зі спеціальними подіями, наприклад, із зворотними викликами (callback) з компонентів Button, Scrollbar і Menu, доведеться заміщати метод action. Цей метод викликають з двома параметрами: подією і компонентом користувацького інтерфейсу, який створив цю подію. Потрібно перевірити цей об'єкт, встановити, який з компонентів надіслав подію, після чого передати керування відповідному оброблювачу. Для того, щоб перевірити, чи належить об'єкт до певного класу, наприклад, до класу Button, можна використовувати оператор instanceof.

Розглянемо приклад опрацювання подій. Порівняно з прикладом для GridLayout додано об'єкт Label і заміщено метод action для того, щоб опрацьовувавати події, що виникають при натисканні кнопок. На ілюстрації нижче: ліворуч — початковий стан, праворуч — після натискання кнопки з написом 6.

Такий самий механізм можна використовувати для керуванням введенням через будь-який з підкласів Component.

Далі у таблиці для кожного елемента пакету AWT перераховано типи подій, які він може породжувати. У першому стовпчику таблиці вказано тип елемента, а в другому — тип відповідної події. Тип події є сталою, яка записують у змінну id об'єкта класу Event. Далі вказано, чи буде передано:

Далі пояснено, що породжує подію і вказано значення, яке буде надано змінної arg об'єкта класу Event. Події, перелічені для елементів класу Component, стосуються до всіх підкласів класу java.awt.Component, а події, перелічені для елементів класу window, стосуються як підкласів класу window, так і класів Dialog і Frame.

Таблиця 1. Елементи AWT і події Java 1.0, породжені ними

ЕлементТип події (id)wxykmЗміст подіїТип і значення arg
Button ACTION_EVENT Натиснуто кнопку String: позначення кнопки
CheckboxACTION_EVENTАктивовано прапорецьBoolean: новий стан прапорця
Choice ACTION_EVENTВибрано елемент спискуString: позначення обраного елемента
Element GOT_FOCUS Отримання фокусу введенняНе використано
Element KEY_ACTIONwxykmНатиснуто функціональну клавішуНе використано, бо key містить назву клавіші
Element KEY_ACTION_ RELEASEwxykmВідпущено функціональну клавішуНе використано, бо key містить назву клавіші
Element KEY_PRESSwxykmНатиснуто клавішуНе використано, бо key містить ASCII-код клавіші
Element KEY_RELEASEwxykmВідпущено клавішуНе використано, бо key містить ASCII-код клавіші
Element LOST_FOCUSВтрата фокусу введенняНе використано
Element MOUSE_ENTERwxyВказівник миші потрапив у область об'єкта класу ComponentНе використано
Element MOUSE_EXITwxyВказівник миші вийшов з області об'єкта класу ComponentНе використано
Element MOUSE_D0WNwxymНатиснуто кнопку мишіНе використано
Element MOUSE_UP wxymВідпущено кнопку мишіНе використано
Element MOUSE_MOVEwxymПереміщено мишуНе використано
Element MOUSE_DRAGwxymПереміщено мишу з утриманням кнопки мишіНе використано
ListACTION_EVENT Подвійне клацання миші на елементі спискуString: позначення обраного елемента
ListLIST_SELECT Вибрано елемент спискуInteger: індекс вибраного елементу
ListLIST_DESELECTПрибрано виділення з певного елементаInteger: індекс елемента
Menu ItemACTION_EVENTВибрано пункт менюString: позначення вибраного пункту
ScrollbarSCROLL_LINE_UPЗдійснено прокрутку вгоруInteger: позиція, до якої здійснено прокрутку
ScrollbarSCROLL_LINE_DOWNЗдійснено прокрутку внизInteger: позиція, до якої здійснено прокрутку
ScrollbarSCROLL_PAGE_UPЗдійснено прокрутку вгору на сторінкуInteger: позиція, до якої здійснено прокрутку
ScrollbarSCROLL_PAGE_DOWNЗдійснено прокрутку вниз на сторінкуInteger: позиція, до якої здійснено прокрутку
ScrollbarSCROLL_ABSOLUTEПереміщено повзунок смуги прокруткиInteger: позиція, до якої здійснено прокрутку
Text FieldACTION_EVENTВедено текст і натиснуто [Return]String: введений текст
WindowWINDOW_DESTROYВікно закритоНе використано
WindowWINDOW_ICONIFYВікно представлено у вигляді піктограмиНе використано
WindowWINDOW_DEICONIFYВікно відновленоНе використано
WindowWINDOW_MOVEDxyВікно переміщеноНе використано

Є відомий приклад, у якому використано модель опрацювання подій Java 1.0. У ньому методи mouseDown і mouseDrag перевизначено таким чином, щоб користувач мав можливість малювати за допомогою миші. Також перевизначено метод keyDown(), щоб при натисканні клавіші С екран було очищено, і метод action, щоб екран було очищено після клацання на кнопці з написов Clear.

Модель опрацювання подій Java 1.1
Нова модель обробки подій є, по суті, модель зворотних викликів (callback). При створенні елемента графічного інтерфейсу користувача описують, який метод або методи цей елемент має викликати при виникненні в ньому певної події. Таку модель легко використати, наприклад, у мові C++, бо ця мова дозволяє оперувати покажчиками на методи. Але в Java це неприпустимо, бо методи не є об'єктами. Тому для реалізації нової моделі необхідно визначити клас, який реалізує деякий спеціальний інтерфейс. Потім можна передати екземпляр такого класу елементу, забезпечуючи таким чином зворотний виклик. Коли настане очікувана подія, елемент викличе відповідний метод об'єкта, визначеного раніше.

Модель опрацюванн подій Java 1.1 використовують як у пакеті AWT, так і в JavaBeans API. У цій моделі різним типам подій відповідають різні класи Java. Кожна подія є підкласом класу java.util.EventObject. Події пакету AWT, які розглянуто в цьому розділі, є підкласом java.awt.AWTEvent. Для зручності події різних типів пакета AWT (наприклад, MouseEvent або АсtionEvent) вкладено в новий пакет java.awt.event.

Кожну подію породжує певний об'єкт, який можна отримати за допомогою методу getSource. Кожній події пакету AWT відповідає певний ідентифікатор, який дозволяє отримати метод getid. Цей параметр використовують для того, щоб відрізняти події різних типів, які описуватися одним і тим же класом подій. Наприклад, для класу FocusEvent можливі два типи подій: FocusEvent.FOCUS_GAINED і FocusEvent.FOCUS_LOST. Підкласи подій містять інформацію, пов'язану з даним типом події. Наприклад, в класі MouseEvent існують методи getX, getY і getClickCount. Цей клас успадковує, серед іншого, й методи getModifiers і getWhen.

Модель опрацювання подій Java 1.1 грунтується на концепції слухача подій — об'єкту, зацікавленого в отриманні даної події. В об'єкті, який породжує подію (у джерелі подій), описано список слухачів, зацікавлених в отриманні повідомлення про те, що дана подія відбулася, і методи, які дозволяють слухачам додавати або видаляти себе з цього списку. Коли джерело породжує подію (або коли об'єкт джерела зареєструє подію, пов'язану з введенням інформації користувачем), він сповіщає всіх слухачів подій про те, що дана подія відбулася.

Джерело події сповіщає об'єкт слухача шляхом виклику спеціального методу і передавання йому об'єкта події (примірника підкласу EventObject). Для того щоб джерело могло викликати даний метод, він повинен бути реалізований для кожного слухача. Наприклад, об'єкти слухачів подій ActionEvent повинні реалізовувати інтерфейс ActionListener. У пакеті Java.awt.event визначені інтерфейси слухачів для кожного з визначених в ньому типів подій. Наприклад, для подій MouseEvent визначено два інтерфейси слухачів: MouseListener і MouseMotionListener. Всі інтерфейси слухачів подій є розширеннями інтерфейсу java.util.EventListener. У цьому інтерфейсі не визначено жодного з методів, але у ньому однозначно визначено всіх слухачів подій як таких.

В інтерфейсі слухача подій можна визначати декілька методів. Наприклад, клас подій, подібний MouseEvent, описує кілька подій, пов'язаних з мишею (натискання і відпускання кнопки миші). Ці події можуть викликати різні методи відповідного слухача. Домовлено: методам слухачів подій передають один аргумент, що містить всі дані, необхідні програмі для формування реакції на подію.

Основні класи подій та опис їх у пакеті Java.awt.event:

Таблиця 2. Типи подій, слухачі й методи слухачів у Java 1.1

Клас подіїІнтерфейс слухачаМетоди слухача
ActionEventActionListeneractionPerformed
AdjustmentEventAdjustmentListeneradjustmentValueChanged
ComponentEventComponentListenercomponentHidden
componentMoved
componentResized
componentShown
ContainerEventContainerListenercomponentAdded
componentRemoved
FocusEventFocusListenerfocusGained
focusLost
ItemEventItemListeneritemStateChanged
KeyEventKeyListenerkeyPressed
keyReleased
keyTyped
MouseEventMouseListenermouseClicked
mouseEntered
mouseExited
mousePressed
mouseReleased
MouseEventMouseMotionListenermouseDragged
mouseMoved
TextEventTextListenertextValueChanged
WindowEventWindowListenerwindowActivated
windowClosed
windowClosing
windowDeactivated
windowDeiconified
windowlconified
windowOpened

Для кожного інтерфейсу слухачів подій, що містить кілька методів, в пакеті java.awt.event визначено простий клас-адаптер, який забезпечує порожнє тіло для кожного з методів відповідного інтерфейсу. Коли потрібен лише один чи два таких методи, простіше описати підклас класу-адаптера, ніж реалізувати інтерфейс самостійно. В описі підкласу адаптера потрібно лише перевизначити ті методи, які потрібні, а при прямій реалізації інтерфейсу необхідно визначити всі методи, в тому числі й непотрібні в даній програмі. Наперед визначені класи-адаптери називають так само, як і інтерфейси, які вони реалізують. Але в цих назвах Listener замінено на Adapter: MouseAdapter, WindowAdapter тощо.

Після реалізації інтерфейсу слухача або отримання підкласу класу-адаптера необхідно створити екземпляр нового класу, щоб визначити конкретний об'єкт слухача подій. Потім цього слухача має зареєстровати відповідне джерелом подій. У програмах пакета AWT джерелом подій завжди є який-небудь елемент пакета. У методах реєстрації слухачів подій використовують стандартні домовленості щодо назв: якщо джерело подій породжує події типу X, в ньому існує метод addXListener для додавання слухача і метод removeXListener для його видалення. Однією з приємних особливостей моделі обробки подій Java 1.1 є можливість легко визначати типи подій, які може породжувати даний елемент. Для цього потрібно лише переглянути, які методи зареєстровано для його слухача подій. Наприклад, з опису API для об'єкта класу Button випливає, що він породжує події ActionEvent. У наступній таблиці подано список елементів пакету AWT і подій, які вони породжують.

Таблиця 3. Елементи пакету AWT й породжувані ними події в Java1.1

ЕлементПороджена подіяЗміст
ButtonActionEventНатиснуто кнопку
CheckBoxItemEventВстановлено або скинуто прапорець
CheckBoxMenuItemItemEventВстановлено або скинуто прапорець меню
ChoiceItemEventВибрано елемент списку або скасовано його вибір
ComponentComponentEventЕлемент або переміщено, або він став прихованим, або видимим
FocusEventЕлемент отримав або втратив фокус введення
KeyEventНатиснуто або відпущено клавішу
MouseEventНатиснуто або відпущено кнопку миші, або вказівник миші увійшов чи покинув область, зайняту елементом, або переміщено мишу (з утриманням кнопки чи без)
ContainerContainerEventЕлемент додано в контейнер або видалено з нього
ListActionEvent Подвійне клацання миші на елементі списку
ItemEventВибрано елемент списку або скасувано такий вибір
MenuItemActionEventВибрано пункт меню
ScrollbarAdjustmentEventЗдійснено прокрутку
TextComponentTextEventВнесено зміни у текст елемента
TextFieldActionEventЗакінчено редагування тексту елемента
WindowWindowEvent Вікно було відкрито, закрито, представлено піктограмою, відновлено або вимагає відновлення

Модель опрацювання подій Java 1.1 є доволі гнучкою і надає користувачеві ряд можливостей для структурування програми опрацювання подій. Перший з цих способів продемонстровано у наступному прикладі, у якому реалізовані інтерфейси MouseListener і MouseMotionListener реєструють себе за допомогою своїх методів addMouseListener і addMouseMotionListener. Як і у попередньому випадку, можна залишати слід від вказівника миші, натискаючи ліву кнопку миші (див. приклад такого сліду нижче праворуч.

Модель опрацювання подій Java 1.1 розроблено з урахуванням того, щоб добре поєднуватися з іншого новою особливістю Java 1.1: вбудованими класами. У наступному прикладі, показано, яких змін зазнає код, якщо слухачі подій буде реалізовано за допомогою анонімних вбудованих класів. Зверніть увагу на компактність коду. Додано кнопку Clear, для якої зареєстровано об'єкт ActionListener, а сама вона виконує очищення екрану при настанні відповідної події.

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

Прокоментуємо цю програму.

  1. Спочатку потрібно імпортувати пакети:

    • java.awt — з описом класів, що визначають елементи інтерфейсу користувача;

    • java.awt.event — з описом класів опрацювання подій.

  2. Головний клас Square (текст програми повинен мати назву Square.java) є нащадком класу Frame. Це має такі наслідки:

    • клас Frame має візуальний еквівалент у вигляді вікна;

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

    • клас Frame, як нащадок класу Container, дозволяє вставляти в себе елементи користувацького інтерфейсу (кнопки, поля введення тощо), з якими буде безпосередньо працювати оператор.

    Клас Square успадковує всі ці візуальні та функціональні властивості від класу Frame як його безпосередній нащадок.

  3. Клас Square реалізує інтерфейс ActionListener, що містить метод actionPerformed, на який передається керування при натисканні кнопки. Тому всі дії, пов’язані з перевіркою співвідношення між числами, буде описано саме в цьому методі.

  4. Опис класу починають з оголошення змінних. Ці змінні (поля класу) будуть досяжними з будь-якого методу класу. Вони відповідають основним елементам користувацького інтерфейсу: полям введення чисел і кнопці Check. Змінну displayStr призначено для виведення відповіді. Може виникнути питання: чому серед цих елементів ми не бачимо надписів (Label). Їх можна було б описати тут, зробивши глобальними. Але їх використано лише в одному місці й описано нижче в конструкторі класу.

  5. Конструктор починають з виклику конструктору суперкласу. Для звертання до батьківського класу у мові Java використовують назву вказівку super. Отже, вираз

    super("Check Square");

    означає звертання до конструктора класу Frame. Як параметр йому передано рядок — заголовок вікна.

  6. Метод setSize встановлює розміри вікна. У попередніх версіях Java для цього використовували метод resize.

  7. Наступний крок — вибір класу розкладки для управління розташуванням елементів користувацького інтерфейсу. Обрано найпростіше послідовне розташування. Це означає, що елементи буде розташовано послідовно зліва направо та згори донизу. Після цього можна перейти безпосередньо до створення елементів і вставляння їх в контейнер за допомогою метода add. При створенні кнопки button1 одразу за допомогою методу addActionListener зареєстровано блок прослуховування події. Це необхідно для того, щоб відповідний метод отримав керування при натисненні кнопки. Інший підхід, який базується на використанні адаптера WindowAdapter ми застосуємо для опрацювання події закриття вікна для завершення роботи програми. Наприкінці конструктора за допомогою метода show виведено на екран вікно програми разом з усіма створеними (описаними) елементами користувацького інтерфейсу.

  8. Метод main дуже простий: у ньому створено клас програми за допомогою конструктора Square. Якщо завершити процес розробки програми на цьому місці, скомпілювати її та виконати, побачимо вікно, подане малюнком безпосередньо перед коментарем до програми. Зрозуміло, що необхідна функціональність поки що відсутня, але зовнішній вигляд програми вже цілком відповідає умовам задачі.

  9. Наступний метод actionPerformed викликають натисканням на кнопку. Як параметр йому передано об’єкт evt класу ActionEvent, який несе повну інформацію про подію, що відбулася. Спочатку за допомогою методу getActionCommand отримано рядок, що містить інформацію про джерело події. В цей момент arg дорівнює "Check". Далі за допомогою методу equals класу String буде перевірено, чи дійсно натиснено саме кнопку "Check", а не іншу. Буде отримано інформацію з текстових полів: спочатку за допомогою методу getText у вигляді рядка, а потім за допомогою статичного методу parseInt класу Integer — у вигляді цілого числа. Далі формується відповідь — рядок displayStr. Для його виведення на екран слугує метод paint. Метод paint напряму не викликано. Якщо необхідно оновити інформацію у вікні, програма викликає метод repaint, а вже він передає керування методу paint.

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

4. Інструктаж з ТБ
5. Закріплення вивченного матеріалу

  1. Проаналізувати код порядково.

  2. Створити проєкт work, у якому файл Work.java містить розглянутий код. Скористатися описом алгоритму створення проєкту для середовища Eclipse чи Netbeans (з точністю до назв пакунку і класу).

  3. Перевірити правильність дії програми, натискаючи на клавіші, переміщаючи мишку та натискаючи на кнопки миші під час роботи програми. Пересвідчитися, що у консоль буде виведено відповідні повідомлення.

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

    Graphtest g = new Graphtest("");

    Перевірити появу нового вікна після відповідної породження певної події, перетягуючи новосворене вікно праворуч від розташування початкового вікна.

6. Підбиття підсумків уроку

  1. Чи досягнуто мети уроку?
  2. Які висновки можна зробити з навчального матеріалу уроку?
  3. Виставлення оцінок.

7. Домашнє завдання

  1. Повторити матеріал уроку.

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

    Порівняти з демонстраційним розв'язанням.


Текст упорядкував Роздобудько Василь Васильович, вчитель інформатики середньої загальноосвітньої школи І–ІІІ ступенів № 66 Дніпровського району міста Києва, під час виконання випускної роботи на курсах підвищення кваліфікації з 24.10.2016 по 28.10.2016.


У роботі використано матеріали, опубліковані на сторінках 16 і 17 розділу сайту helloworld.ru, присвяченому мові Java.