Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Об'єктно орієнтовне програмування1.doc
Скачиваний:
5
Добавлен:
17.11.2019
Размер:
1.38 Mб
Скачать

2.4. Класи, їх структура та зміст

Опис класу починається з ключового слова class, а його ім'я — з великої літери: class Pet{ <тіло класу>

Загальний формат ключового слова class має такий вигляд:

Ім'я суперкласу список інтерфейсів

[модифікатор класу] class <ім'я класу> [extends <ім'я батьків­ського класу>] [implements <ім'я — і>] {тіло класу}

  • public —

  • abstract —

  • final —

  • strictfp —

Тіло класу містить опис змінних, методів, вкладених класів та інтерфейсів.

[модифікатор складного класу] class <ім'я вкладеного класу> {тіло вкладеного класу}

  • public —

  • abstract —

  • final —

  • strictfp —

  • protected —

  • private —

  • static —

Опис змінної вказує його тип та ім'я і може починатися з од­ного або кількох необов'язкових модифікаторів public, protected, static, final, transient, volatile.

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

[модифікатор] ім'я методу {тіло методу}

public

protected

private

abstract

static

final

synchronized

strictfp

У списку параметрів через кому перелічуються тип та ім'я кожного параметра. Якщо перед будь-яким параметром стоїть модифікатор final, то цей параметр не може змінюватись всере­дині методу. Для кожного параметра перед початком роботи методу виділяється пам'ять, в якій розміщується значення параметра. Ім'я методу, кількість і типи параметрів становлять сигнатуру методу.

Компілятор з мови Java розрізняє методи за сигнатурами. Це дає змогу записувати різні методи з однаковими іменами.

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

Прикладом використання різних методів з однаковими імена­ми є перевантаження методів:

sliahto (int x, int у) — пункт призначення з географічними координатами;

sliahto («Київ») — географічна назва пункту за умови визна­чення SliahTo (string destination) Або їх перевизначення:

class Truck extends Automobile { void moveTo (intx, inty) {

}

}

У даному разі метод з таким самим ім'ям у підкласі перекри­ває метод суперкласу. Наприклад, визначивши об'єкт класу Truck через

Truck honda = new Truck(); і записавши honda.MoveTo (ЗО, 100), ми звернулися до методу класу Truck. При перевизначенні права доступу до методу вони можуть розширюватися: public має бути відкритим, protected може стати відкритим.

Зауваження. За допомогою слова super можна звер нутися із середини прикладу до методу суперкласу: super.moveTo(30,100).

Ім'я методу, що належного тому самому класу, можна уточни­ти за допомогою this.moveTo(50,60).

Усі методи в мові Java — віртуальні функції. Розглянемо приклад: abstract class Pet {

abstract void voice ()

{

class Dog extends Pet {

intk=10;

void voice () {

System.out.println (" ");

}

}

class Cat extends Pet { void voice () {

System.out.println (" ");

}

}

class Cat extends Pet { void voice () {

System.out.println (" ");

}

}

public class Chorus {

public static void main (string [] args){

Pet [] singer = new Pet[3];

singer [0] = new Dog();

singer [1] = new Cat();

singer [2] = new Cow();

for (int i=0; і <singer. length; i++)

singer fiJ.voice();

}

}

Масив посилань singer[] має тип Pet, але кожний його елемент посилається на об'єкт свого типу Dog, Cat, Cow. При виконанні програми викликається метод конкретного об'єкта, а не метод класу, яким визначається ім'я посилання. Цю процедуру назива­ють поліморфізмом.

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

Для пояснення необхідності використання абстрактних імен слід розглянути елементи масиву singer[] прикладу. Ці елементи виконують посилання на підкласи Dog, Cat, Cow. Але це змінні типу Pet, і посилатися вони можуть тільки на поля та методи, описані в суперкласі Pet. Допоміжні поля підкласу для них не до­ступні. Тому метод, який реалізовується в кількох підкласах, ви­носиться до суперкласу, а там оголошується абстрактним. Абст­рактні класи містяться на верхньому рівні ієрархи класів.

Зауваження. Головним класом в ієрархії класів Java є клас object, який містить тільки загальні власти­вості всіх класів.

У мові Java творець класу може гарантувати ініціалізацію кожного об'єкта за допомогою спеціального методу — конст­руктора. Якщо в класі існує конструктор, Java автоматично ви­кликає його при створенні об'єкта. Таким чином, ініціалізація гарантована. Конструктор — це метод, ім'я якого точно збі­гається з іменем класу. Кожний конструктор має розглянуті далі особливості:

> Конструктор існує в будь-якому класі. Якщо конструктор не записаний, то компілятор Java його створює за замовчуванням.

Цей конструктор нічого не робить, а лише викликає конструктора суперкласу.

> Конструктор виконується автоматично при створенні при­мірника класу, після розподілу пам'яті та обнулення полів, але до початку використання створеного об'єкта.

> Конструктор не повертає ніякого значення, тому в його опису відсутнє void, але може бути один із трьох модифікаторів доступу: public, protected, private.

> Конструктор не є звичайним методом, членом класу, тому його не можна успадкувати або перевизначити в класі.

> Тіло конструктора може починатися:

  • словом super () із параметрами в дужках, якщо вони потріб­ ні, викликається один із конструкторів суперкласу;

  • словом this () з параметрами в дужках, якщо вони потрібні, викликається другий конструктор того самого класу.

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

Для виділення пам'яті масивам і об'єктам використовується операція new.

Наприклад:

Double a[] = new double[100];

— тип елемента масиву і кількість його елементів у квадрат­них дужках.

Результатом операції new є посилання на створений об'єкт. Це посилання може бути присвоєне змінній типу посилання на да­ний тип:

Dog к5 = new Dog(); або безпосередньо new Dog(). voice ();

Після створення об'єкта без імені відразу виконується його метод voice().

Одним із головних методів, характерний для будь-якої про­грами мовою Java, є метод з ім'ям main(). Метод main() виклика­ється автоматично системою Java із самого початку виконання додатка. Інтерпретатор отримує клас, де міститься метод mam(), і починає з нього виконання програми.

З метою налагодження метод main() заносять до кожного кла­су програми. Для перевірки роботи всіх методів класу в метод main() включають тести.

Наприклад: class Prim { public static void main (String[] args)

for (int і = 0; i<args.lenght;i++) System.out.println("args["+i+” ] = "+args[i]);

}

}

Тут програма виводить параметри, які передаються в методі main() при запуску. У методі main() можна передати кілька пара­метрів, які інтерпретатор заносить у масив рядків. Ці параметри розміщуються безпосередньо після імені класу в рядку виклику Java.

Теорія ООП радить з'ясувати, в якому відношен­ ні перебувають класи А і В: клас В є примірником класу А або клас В —- частина класу А

Питання і завдання

  1. Оголошення статистичних змінних.

  2. Область бачення та ініціалізація змінних.

  3. Вкладені класи різних рівнів.

  4. Чи успадковуються вкладені класи?

  5. Як з підкласу звернутися до методу суперкласу?

  6. Чи можуть вкладені класи бути розширенням інших класів?