Читайте также: |
|
}
class Dog extends Pet{
int k = 10;
void voice(){
System.out.println("Hav-hav!");
}
}
class Cat extends Pet{
void voice () {
System.out.println("Miaou!");
}
}
class Cow extends Pet{
void voice(){
System.out.println("Mu-u-u!");
}
}
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; i < singer.length; i++)
singer[i].voice();
}
}
Вся справа тут у визначенні поля singer[]. Хоча масив singer [] має тип Pet, кожний його елемент посилається на об’єкт свого типу Dog, Cat, Сow. При виконанні програми викликається метод конкретного об’єкта, а не метод класу, яким визначалася назва посилання. Так у Java реалізується поліморфізм.
У мові Java всі методи є віртуальними функціями. Клас Pet і метод voice() є абстрактними.
2.3. АБСТРАКТНІ МЕТОДИ І КЛАСИ
При описі класу Pet ми не можемо задати у методі voice () жодного корисного алгоритму, оскільки у всіх тварин різні голоси. У таких випадках ми записуємо тільки заголовок метода і ставимо після списку параметрів і закриваючої дужки крапку з комою. Цей метод буде абстрактним (abstract), що необхідно вказати компілятору модифікатором abstract.
Якщо клас містить хоча б один абстрактний метод, то створити його екземпляри, а тим більше використовувати їх не вдасця. Такий клас стає абстрактним, що обов’язково треба вказати модифікатором abstract.
Абстрактні класи використовуються тільки породжуючи від них підкласи, в яких перевизначені абстрактні методи. Звернемося до лістингу 2.2., щоби розібратися для чого потрібні абстрактні класи.
Хоча елементи масиву singer [] посилаються на підкласи Dog, Cat, Cow, але все-таки це змінні типу Pet і посилатися вони можуть тільки на поля і методи, описані у суперкласі Pet. Додаткові поля підкласу для них є недоступними. Якщо звернутися, наприклад, до поля k класу Dog, написавши singer[0].k, тоді компілятор "скаже", що він не може реалізувати таке посилання. Тому метод, який реалізується у декількох підкласах, приходиться виносити у суперклас, а якщо там його неможливо реалізувати, тоді його необхідно оголосити абстрактним. Таким чином, абстрактні класи групуються на вершині ієрархії класів.
Можна задати порожню реалізацію методу, поставивши пару фігурних дужок, нічого не написавши між ними, наприклад:
void voice(){}
Отримується повноцінний метод. Але це штучне рішення, яке заплутає структуру класу. Замкнути ж ієрархію можна остаточними класами.
2.4. ОСТАТОЧНІ ЧЛЕНИ І КЛАСИ
Помітивши метод модифікатором final, можна заборонити його перевизначення у підкласах. Це зручно з метою безпеки. Можна бути впевненим, що метод виконує ті дії, які йому задані. Саме так визначені математичні функції sin(), cos() та інші у класі Math: метод Math.cos (x) обчислює саме косинус числа х. Зрозуміло, що такий метод не може бути абстрактним.
Для повної безпеки, поля, які обробляються остаточними методами, належить зробити закритими (private).
Якщо ж помітити модифікатором final увесь клас, тоді його взагалі не можна буде розширювати. Так визначений, наприклад, класс Math:
public final class Math{... }
Для змінних модифікатор final має зовсім інший зміст. Якщо помітити модифікатором final опис змінної, тоді її значення (а воно повинно бути обов’язково задане або тут, або у блоці ініціалізації або в конструкторі) не можна змінити ні в підкласах, ні у самому класі. Змінна перетворюється у константу. У мові Java визначаються константи:
public final int MIN_VALUE = -1, MAX_VALUE = 9999;
Відповідно до "Code Conventions" константи записуються великими літерами, слова у них розділяються знаком підкреслення.
На самій вершині ієрархії класів Java стоїть клас Object.
КЛАС Object
Якщо при описі класу ми не вказуємо жодне розширення, тобто не пишемо слово extends і назву класу за ним, як при описі класу Pet, тоді Java вважає цей клас розширенням класу Оbject, і компілятор дописує це за нас:
class Pet extends Object{... }
Це розширення можна записати і явно.
Сам клас Оbject не є нічиїм нащадком, від нього починається ієрархія всіх класів Java. Зокрема, всі масиви — прямі нащадки класу Оbject.
Оскільки такий клас може містити тільки загальні властивості всіх класів, у нього включено лише декілька найзагальних методів, наприклад, метод equals(), що порівнює даний об’єкт на рівність з об’єктом, заданим в аргументі, і який повертає логічне значення. Його можна використати таким чином:
Object obj1 = new Dog(), obj 2 = new Cat();
Дата добавления: 2015-11-14; просмотров: 143 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Public double f(double x) | | | КОНСТРУКТОРИ КЛАСУ |