
ЕВ-4791
.pdfSystem.out.println (
«Конструктор тільки з параметром int, petalCount = »
+ |
petalCount); |
} |
|
Flower(String ss) { |
|
System.out.println ( |
|
«Конструктор тільки з рядком. s =« + ss); |
|
s = ss; |
|
} |
|
Flower(String s, int petals) { |
|
this(petals); |
|
//! |
this(s); // Два виклики заборонені |
this.s = s; //Друге використання this |
|
System.out.println («Параметри String & int»); |
|
} |
|
Flower() { |
|
this(«Вітаю», 47); |
|
System.out.println ( |
«Конструктор за замовчуванням (б/параметрів)»);
}
void print() {
//! this(11); // Поза конструктором заборонено
System.out.println (
«petalCount = « + petalCount + « s = « + s);
}
public static void main(String args[]) { Flower x = new Flower();
x.print();
}
}
Приклад 7. Програма «збирач сміття» і процесу завершення. class Chair {
static boolean gcrun = false; static boolean f = false; static int created = 0;
static int finalized = 0; int i;
Chair () {
i = ++created; if(created == 47)
System.out.println («Створено 47 об’єктів»);
}
public void finalize() { if (!gcrun) {
//
gcrun = true; System.out.println («
Розпочинаємо завершальні дії після створення « + created + « об’єктів Chair»);
}
if (i == 47) { System.out.println (
«Завершуємо об’єкт Chair #47, « +
«Встановлюємо прапор для зупинки створення Chair»); f = true;
}
finalized++; if(finalized >= created)
41
System.out.println («Усе» + finalized + «об’єктів видалено»);
}
}
public class Garbage {
public static void main(String args[]) { while (!Chair.f) {
new Chair();
new String («Зайняти пам’ять «);
}
System.out.println («Після створення всіх об’єктів Chair:\n + «отже, створено = «+ Chair.created +
«отже, завершено = « + Chair.finalized );
//Додаткові параметри нав’язують
//«збирання сміття» і завершення if (args.length > 0) { args[0].equals(«gc») || args[0].equals(«all»)) { System.out.println («gc():»); System.gc();
}
if ( args[0].equals(«finalize») || args[0].equals(«all»)) { System.out.println («runFinalization():»); System. runFinalization();
}
}
System.out.println («Мабуть, усе!»);
} }
7.2.Завдання для відпрацювання самостійної роботи
Навчальні завдання
1.Створити клас з конструктором без параметрів, який виводить на екран повідомлення. Створити об’єкт цього класу.
2.Додати до класу із завдання 1 перевантажений конструктор, параметром якого є рядок
String.
3.Необхідно створити масив посилань на об’єкти класу, що створений у завданні 2, але не створювати об’єкти для приєднання до елементів масиву. При виконанні програми необхідно контролювати появу на екрані повідомлення конструктора.
4.Завершити завдання 3, приєднавши до посилань масиву реальні об’єкти масиву.
5.Створити клас Prep (викладач) з перевантаженим методом bark() (виступ). Метод має бути перевантажений залежно від різноманітних примітивних типів даних і виводити повідомлення залежно від версії (лекція, семінар, консультація) перевантаженого методу. Написати метод main(), який викликає всі методи.
6.Необхідно створити масив із рядка String і присвоїти рядок кожному елементу масиву. Масив вивести на друк за допомогою циклу for.
7.Створити клас із двома методами. У першому методі двічі здійснити виклик іншого методу: перший раз без використання ключового слова this, а другий виклик — з його використанням.
8.Створити клас із двома перевантаженими конструкторами. Використовуючи ключове слово this, викликати другий конструктор із першого.
9.Створити клас із методом finalize(), який виводить повідомлення. У методі main() створити об’єкт класу. Пояснити поведінку програми.
10.Створити клас з ім’ям Tank (ємкість), який можна наповнити й спорожнити і в якого є умова знищення — має бути порожнім перед знищенням. Написати метод finalize(), який перевіряє цю умову знищення. У методі main() перевірити всі можливі випадки використання класу.
42
7.3.Контрольні тестові завдання теми
1.Заповніть пропуски в наведених далі ствердженнях:
а) Програмні модулі Java називаються ________ та ____________. в) Метод активізується через ___________.
с) Змінна, яка доступна тільки всередині методу і в ньому ж визначена, називається
_________.
d)Оператор ____________ у викликаному методі може використовуватися для передання значення виразу назад у метод, що викликає.
e)Ключове слово __________ означає, що метод не повертає значення.
f)____________ ідентифікатора визначає ту частину програми, в якій ідентифікатор може використовуватися.
g)Існує три способи повернення управління з методу, що викликається у викликаний ме-
тод, ______________, __________, ________________.
h)Метод _____________ викликається тільки один раз, коли аплет розпочинає своє виконання.
i)Метод ________________ генерує випадкові числа.
j)Метод ______________ викликається щоразу, коли користувач браузера повертається на сторінку HTML, яка містить аплет.
к) Метод ____________ викликається, коли аплету треба вивести зображення.
l)Змінні, оголошені у блоці або у списку параметрів методу, мають ______ час існування.
m)Метод ___________ викликає метод аплету update, який, своєю чергою, викликає метод аплету paint.
n)Метод ___________ викликається контейнером аплету щоразу, коли користувач завершує перегляд у браузері сторінки HTML, на якій розміщується аплет.
о) Метод, що викликає самого себе напряму або побічно, називається _________ методом. р) У Java є можливість визначати різні методи з однаковим ім’ям, кожне з яких працює з різними типами або різною кількістю параметрів. Ця особливість називається ___________
методів.
q)Ключове слово _____________ використовують для оголошення змінних тільки для читання.
2. Укажіть області дій (класу чи блоку) для кожного з елементів наведеної далі програми: а) змінна x; б) змінна y; в) метод cube; г) метод paint; д) метод yPos.
_________________________________________________________
public class CubeTest extends JApplet { int x;
public void paint (Graphics g) { int yPos = 25;
for (x = 1; x<= 10; x++) { g.drawString (cube (x), 25, yPos); yPos +=15;
}
}
public int cube (int y) { return y*y*y; }}
Рекомендована література [17; 20; 21].
43
Тема 8. РЕАЛІЗАЦІЯ І СПЕЦИФІКАТОРИ ДОСТУПУ В JAVA
Вивчивши матеріал теми, студенти знатимуть:
—особливості використання пакета;
—технологію формування та використання пакета;
—створення унікальних імен пакетів;
—порядок формування власної бібліотеки інструментів;
—використання імпорту для зміни поведінки;
—застереження та дії при роботі з пакетами;
—спеціфікатори доступу для класу, члена класу або методу;
—як відбувається безпечна реалізація програм.
Вивчення матеріалу теми допоможе студентам:
•формувати та використовувати пакети;
•використовувати характеристики доступу: «дружній», public, private, protected;
•описувати тіло інтерфейсу у вигляді методів і констант;
•реалізовувати інтерфейси;
•посилатися на інтерфейс;
•передавати інтерфейси як типи.
8.1.Навчальні завдання для виконання практичної роботи
Мета роботи: сформувати теоретичні знання та практичні навички зі створення й реалізації інтерфейсів та застосування спеціфікаторів доступу в Java.
План
1.Сутності специфікаторів доступу до даних.
2.Структури інтерфейсних, статичних та абстрактних методів.
3.Цілі методів paint() i main().
4.Особливості класів і об’єктів у побудові ієрархії класів.
5.Визначення і реалізації інтерфейсів.
6.Результати дії методів успадкування.
7.Структура взаємозв’язків між класами на різних рівнях ієрархії.
8.2.Завдання для відпрацювання самостійної роботи
Навчальні завдання
1.Створити програму, в якій створюється об’єкт класу ArrayList, але не імпортується па-
кет java.util.*.
2.Узагальнити клас Р, додавши до нього всі перевантажені версії методів rint() і rintln(), необхідні для виведення всіх примітивних типів Java.
3.Створити клас, в якому існують дані та методи зі специфікаторами public, private, protected, а також «дружні». Створить об’єкт цього класу та проаналізувати повідомлення, які видає компілятор при спробі звернення до всіх членів класу. Пам’ятайте, що класи в поточній директорії є частиною пакета «за замовчуванням».
4.Створити клас із protected даними. Створити другий клас у цьому ж файлі, який маніпулює цими protected даними з першого класу.
5.Створити нову директорію та відредагувати змінну оточення CLASSPATH, щоб вона включала цю директорію. Виконати копіювання файла P.class у нову директорію, а потім змінити імена: файла, класу Р всередині нього, методів у цьому класі. Створити програму в іншій директорії, яка використовує новий клас.
6.Написати клас, доступ до якого має бути обмеженим, або клас, що використовується в межах іншого класу.
7.Написати програму забезпечення зворотних викликів, тобто надати іншим класам можливість звертатися до коду.
8.Для класу public class Cookie {
public Cookie() {
44
System.out.print(« «);
}
protected void bite() { System.out.println(«bite «);
} }
змінити protected на «дружній». Перевірте, чи є метод bite() відкритим.
9.Створити в локальній директорії такий файл: package с05.local;
class PackagedClass() { public PackagedClass() {
System.out.println(«Створюємо клас у пакеті»);
} }
Потім створюємо в директорії с05.fore файл: package с05.fore;
import с05.local.*; public class Fore {
public static void main (String[] args) { PackagedClass pc=new PackagedClass(); } }.
Поясніть, чому після компіляції з’являються помилки і як їх виправити.
10.Скласти програму, в якій є посилання на інтерфейс.
8.3.Контрольні тестові завдання теми
Заповніть пропуски в запропонованих ствердженнях:
1.Члени класу доступні за допомогою операції _______ із посиланням на об’єкт класу.
2.Члени класу, оголошені як ____________, доступні тільки методам класу.
3.__________ є спеціальним методом для надання початкових значень змінним екземпляра класу.
4.Метод _________ використовують для присвоєння значень закритим змінним екземплярам класу.
5.Методи класу зазвичай роблять __________ типу, а змінні екземпляра класу — _____
типу.
6.Метод ___________ використовують для отримання значень закритих даних класу.
7.Для введення визначення класу використовують ключове слово ________.
8.Оголошені елементи класу ________, доступні в області дії об’єкта класу.
9.Операція _____________ динамічно видокремлює пам’ять для об’єкта вказаного типу і повертає ____________ на нього.
10._____________ змінна класу використовується для надання інформації, спільної для всіх об’єктів класу.
11.Ключове слово ___________ означає, що змінна або об’єкт не можуть змінюватися після їх ініціалізації.
12.Метод, оголошений статичним, не має доступу до _________ членів класу.
Рекомендована література [12; 15; 16].
45
Тема 9. ОСОБЛИВОСТІ ВИКОРИСТАННЯ УСПАДКУВАННЯ В ПРОГРАМАХ
Вивчивши матеріал теми, студенти знатимуть:
—що являє собою успадкування, притаманне програмному забезпеченню різноманітних економічних систем;
—які труднощі виникають на шляху залучення механізму успадкування у програмних системах;
—що таке «множинне успадкування» мовою Java, приклади систем;
—які основні ознаки розширення інтерфейсу за допомогою успадкування;
—що таке внутрішні класи в методах і областях бачення;
—яким чином визначають зв’язок із зовнішнім класом у додатках;
—у чому полягає сутність вкладених інтерфейсів.
Вивчення матеріалу теми допоможе студентам:
•групувати константи та ініціалізувати поля інтерфейсів;
•використовувати зовнішнє оточення з внутрішнього класу вільного рівня вкладеності;
•виявляти недоліки наявних підходів до формування інтерфейсів складної структури й імовірні можливі шляхи подолання їх;
•розробляти заходи з успадкування від внутрішніх класів об’єктів конкретної предметної області.
9.1.Навчальні завдання для відпрацювання самостійної роботи
Мета роботи: ознайомлення студентів з основними особливостями застосування механізму успадкування при формуванні програмних продуктів складної структури.
Навчальні завдання
1.Довести, що поля інтерфейсу автоматично оголошуються статичними (static) і незмін-
ними (final).
2.Створити інтерфейс, що містить три методи у власному пакеті.
3.Реалізуйте цей інтерфейс в іншому пакеті.
4.Довести, що всі методи інтерфейсу автоматично є відкритими (public).
5.Створити три інтерфейси, в кожному з яких по два методи.
6.Успадкуйте новий інтерфейс від цих трьох і додайте до нього новий метод. Створіть клас, який реалізує цей новий інтерфейс, а також успадковувальний від реального базового класу. Після цього напишіть чотири методи, кожний з яких залучає один з інтерфейсів як параметр. У методі main() створіть об’єкт вашого класу і передайте його почергово в усі методи.
7.Змінити вправу 4: створити абстрактний клас (abstract) і успадкувати від нього новий
клас.
8.Створити інтерфейс не менш ніж з одним методом у його власному пакеті. Створити клас в окремому пакеті. Додати до нього захищений (protected) внутрішній клас, який реалізує інтерфейс. У третьому пакеті успадкуйте від Вашого класу і всередині методу поверніть об’єкт захищеного внутрішнього класу. Під час повернення проводити перетворення.
9.Створити інтерфейс не менш ніж з одним методом і реалізувати цей інтерфейс, визначивши внутрішній клас всередині методу, що повертає посилання на ваш інтерфейс.
10.Повторити вправу 7, але визначити в ній внутрішній клас в області бачення, що перебуває всередині методу.
11.Повторити вправу 7, використовуючи внутрішній клас без імені.
12.Створити закритий (private) внутрішній клас, який реалізує відкритий (public) інтерфейс. Написати метод, що повертає посилання на eкземпляр закритого внутрішнього класу, перетворене до інтерфейсу. Показати, що внутрішній клас повністю прихований.
13.Створити два класи з іменами А та В, з конструкторами за замовченням (порожні списки параметрів), які оголошують про своє виконання. Успадкуйте новий клас С від А і створіть член класу В всередині класу С. Створить об’єкт класу С. Не визначайте конструктор для класу С. Створіть об’єкт для класу С і перегляньте результат.
14.Створити простий клас. У другому класі визначити поле для об’єкта першого класу. Використовуйте «ледащу» ініціалізацію для створення цього класу.
46
15.Успадкуйте від класу Detergent новий клас. Перевизначте метод scrub() і додайте новий метод з ім’ям sterilize().
16.Створити базовий клас з єдиним конструктором не за замовчуванням і похідний клас з конструктором і за замовчуванням та параметрами.
17.У конструкторі похідного класу викличте конструктор базового класу.
18.Створити клас Root, який містить екземпляри кожного з класів (також створеними вами) comp1, comp2, comp3. Зробіть клас Stem від класу Root так, щоб у ньому містилися екземпляри кожного з названих класів. У всіх класах має бути конструктор, що виводить повідомлення про свій клас.
19.Створити клас із методом, який був перевантажений тричі.
20.Успадкуйте новий клас, додайте ще один перевантажений метод і покажіть, що всі чотири методи доступні в похідному класі.
21.У файлі Car.java додайте метод service() до класу Engine і викличте цей метод з методу main().
22.Створити клас у пакеті. Цей клас має містити метод зі специфікатором protected. Поза пакетом спробуйте викликати метод protected і пояснити, що відбувається. Потім успадкуйте від вашого класу і викличте метод protected з іншого методу вашого похідного класу.
23.Створити клас з ім’ям Amfibia. Від цього класу успадкуйте клас Frog.
24.На ваш розсуд у базовому класі розмістити кілька методів. У методі main() створити об’єкт Frog, провести східне перетворення до Amfibia і довести, що всі методи працюють.
25.Створити клас із незмінним (final) методом. Успадкуйте від цього класу і спробуйте перевизначити цей метод.
9.2.Контрольне тестування знання завдання теми
Заповніть пропуски у наведених далі ствердженнях:
1.Якщо клас Alpha є нащадком класу Beta, то клас Alpha називається ______________, а
клас Beta — ____________.
2.Використання успадкування дає змогу створювати код, який може бути ___________, що скорочує час розроблення програм.
3.Об’єкт ____________ можна розглядати як об’єкт свого __________.
4.Існує чотири рівні доступу до елементу — ___________, __________, ____________ і
_____________.
5.Зв’язок «використовує», виникає між класами при використанні __________, а зв’язок «є» забезпечує механізм _______________.
6.Використання поліморфізму дає змогу не використовувати в програмах оператор
_________.
7.Якщо клас містить один чи більше абстрактних методів, то він має назву
____________.
8.Дозвіл виклику методу під час виконання програми називається ____________
зв’язуванням.
9.Підклас може викликати будь-який незакритий метод суперкласу шляхом додавання до виклику методу ключового слова ____________.
Визначте, чи правильним є твердження:
1.Суперклас зазвичай має більше об’єктів, ніж його підклас.
2.Підклас зазвичай інкапсулює меншу кількість функціональних можливостей порівняно зі своїм суперкласом.
Рекомендована література [17; 20; 21].
47
Тема 10. ДИНАМІЧНЕ ЗВ’ЯЗУВАННЯ (ПОЛІМОРФІЗМ) У СТРУКТУРІ ПРОГРАМ
Вивчивши матеріал теми, студенти знатимуть:
—що являє собою поліморфізм, притаманний будь-якому програмному забезпеченню об’єктно-орієнтованих систем;
—які труднощі виникають на шляху формування і залучення поліморфних методів у програмах;
—що таке різноманітні форми зв’язування (динамічне, пізне, зв’язування під час виконання);
—якими є основні ознаки поліморфізму;
—що таке організована та неорганізована складність і як подають канонічну форму складної системи;
—яким чином виконується зв’язування метод-виклик;
—у чому полягає сутність чистого успадкування порівняно з розширенням.
Вивчення матеріалу теми допоможе студентам:
•ігнорувати тип об’єкта;
•використовувати перевизначення проти перевантаження;
•виявляти недоліки наявних підходів залучення поліморфізму до формування програм складної структури й імовірні шляхи подолання їх;
•розробляти заходи для дій поліморфних методів у разі виклику їх із конструкторів.
10.1.Навчальні завдання для опрацювання лабораторної роботи
Лабораторна робота
«Організація поліморфних методів у створенні ефективного коду програм»
Мета роботи. Сформувати вміння і закріпити знання:
створювати абстрактні методи і класи мовою Java;
зв’язувати методи-виклики для отримання необхідного результату;
аналізувати і перевизначати методи;
викликати інтерпретатор для отримання результатів роботи програми;
використовувати успадкування як інструмент поліморфізму;
шляхом композиції динамічно змінювати поведінку об’єкта.
Виконання роботи
1.Провести десятихвилинне опитування, з’ясувати рівень засвоєння студентами термінів
іпонять цієї теми.
2.Виконати комплекс програм із поліморфними методами.
3.Проаналізувати виконання запропонованої викладачем програми з поліморфними блоками.
4.Скласти звіт і захистити його.
Інформаційне забезпечення
1.Перелік завдань для виконання лабораторної роботи.
2.Програмне середовище JDK.
10.2.Завдання для опрацювання самостійної роботи
Мета роботи: закріпити практичні навички залучення механізму поліморфних методів для формування ефективної структури програми
Навчальні завдання
Маємо текст програми: Shapes.java class Shape { void draw() {}
48
void erase() |
{} |
} |
|
class Circle extends Shape { |
|
void draw() |
{ |
System.out.println(«Circle.draw()»); |
|
} |
{ |
void erase() |
|
System.out.println(«Circle.erase()»); |
|
} |
|
} |
|
class Square extends Shape { |
|
void draw() |
{ |
System.out.println(«Square.draw()»); |
|
} |
{ |
void erase() |
|
System.out.println(«Square.erase()»); |
|
} |
|
} |
|
class Triangle extends Shape { |
|
void draw() |
{ |
System.out.println(«Triangle.draw()»); |
|
void erase() |
{ |
System.out.println(«Triangle.erase()»); |
|
} |
|
} |
|
public class Shapes |
{ |
{ |
public static Shape randShape() |
||
switch((int)(Math.random()*3)) |
{ |
|
default: |
|
|
case 0: return new Circle(); |
|
|
case 0: return new Circle(); |
|
|
case 0: return new Circle(); |
|
|
} |
|
|
} |
|
|
public static void main(String[] args) { |
||
Shape[] s = new Shape[9]; |
|
|
for (int i=0;i<s.length;i++) |
|
|
s[i] = randShape(); |
for (int i=0;i<s.length;i++) |
|
s[i].draw(); |
|
|
} |
|
|
}///:~
1.До базового класу програми Shapes.java додайте новий метод, який друкує повідомлення, але не перевизначайте його в похідних класах. Поясніть, що відбувається. Після цього треба перевизначити його в одному із похідних класів, але не в усіх, і подивитися, що відбувається. Після завершення слід перевизначити метод для всіх похідних класів.
2.Додайте новий підтип Shape до програми Shapes.java і перевірте в методі main(), що поліморфізм робить правильно для вашого нового типу, також як і для старих типів.
3.Створіть ієрархію успадкування. За основу обрати різноманітні типи викладачів. Базовим класом буде Vicld (викладач), а похідними класами будуть Prof(професор), Docent (доцент) тощо.
У базовому класі визначити декілька загальних методів, які потім перевизначити в похідних класах для того, щоб вони виробили дії, характерні для визначеного типу об’єкта. Створіть масив з об’єктів Vicld, заповніть його різноманітними похідними типами і викличте методи базового класу, щоб побачити результати роботи програми.
4.З завдання 3 зробіть так, щоб клас Vicld став абстрактним (abstract) класом. Зробіть також деякі методи класу Vicld абстрактними там, де це має значення.
5.Створіть клас і зробіть його abstract таким, щоб він не мав жодного абстрактного методу. Потім перевірте неможливість створення екземпляру цього класу.
49
6.Створіть трирівневу ієрархію успадкування. У кожному класі ієрархії повинен бути метод finalize(), який викликає метод finalize() базового класу. Покажіть, що ваша ієрархія працює.
7.Створіть базовий клас з двома методами. З першого методу викличте другий метод. Успадкуйте клас і перевизначте другий метод. Створіть об’єкт похідного класу, проведіть східне перетворення до базового типу і викличте перший метод. Поясніть події, що відбуваються.
8.Створіть базовий клас з визначенням методу abstract print(), який перевизначається похідними класами. Перевизначена версія методу виводить значення цілого числа int, який описаний у похідному класі.
У точці визначення цієї змінної надайте їй нульове значення. В конструкторі базового класу викличте цей метод. В методі main() створіть об’єкт похідного типу, а потім викличте його метод print().Поясніть події, що відбуваються.
9.Створіть абстрактний клас без методів. Зробіть від нього клас і додайте метод. Створить статичний метод, який має параметр вказівку на базовий клас. Проведіть низрухоме перетворення до похідного типу і викличте цей метод. У методі main() покажіть, як це працює. Після цього розмістіть у базовому класі абстрактне визначення методу, щоб необхідність низрухомого перетворення зникла.
10.Задачу 3 змінити так, щоб програма демонструвала порядок ініціалізації базових і похідних класів. Потім додайте об’єкти-члени і до базових, і до похідних класів та покажіть, у якому порядку проходить їх ініціалізація при конструюванні об’єкта.
10.3.Завдання для виконання індивідуальної роботи
Індивідуальна робота студентів передбачає налагодження і виконання запропонованих програм з аналізом помилок і позаштатних ситуацій. Кожний зі студентів повинен відпрацювати наведені приклади і надати власний коментар та висновки з виконання окремого додатку.
Завдання 1. Система управління світлофором. interface Lights {
int RED = 0;
int YELLOW = 1; int GREEN = 2; int ERROR = -1;
}
class Timer implements Lights { private int delay;
private static int light = RED; Timer (int sec) {delay = 1000*sec;} public int shift() {
int count = (light++) % 3; try {
switch(count) {
case RED: Thread.sleep(delay); break;
case YELLOW: Thread.sleep(delay/3); break; case GREEN: Thread.sleep(delay/2); break;
}
}catch (Exception e) {return ERROR;} return count;
}
}
class TrafficRegulator {
private static Timer t = new Timer(1); public static void main (String[] args) {
for (int k=0; k < 10; k++) switch(t.shift()) {
case Lights.RED: System.out.println(«Stop!»); break;
case Lights.YELLOW: System.out.println(«Wait!»); break; case Lights.GREEN: System.out.println(«Go!»); break;
50