Java для школьников. Занятие №13. Интерфейсы. Использование метода, определенного в интерфейсе, классами-наследниками

Предыдущее занятие Следущее занятие

Новое на этом занятии:

  • Полиморфизм как способ написания "красивого", а главное более понятного кода в Java;
  • операторы цикла for с синтаксисом "foreach";

Не так давно, на занятии посвященном наследованию мы с вами говорили, что именно оно (наследование) делает язык Java объектно-ориентированным. Это не до конца является правдой, т.к. кроме наследования важной чертой объектно-ориентированного программирования (ООП) является ПОЛИМОРФИЗМ.

(ПОЛИМОРФНЫЙ — греч., от polys многий, и morphe вид. Многовидный, многоформенный, многообразный. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910.).

Полиморфизм в языках программирования позволяет определять функцию (метод) или тип данных обобщенно, так что информация обрабатывается идентично, вне зависимости от типа объектов (подробнее см., например, Википедию). Поясним это на примере (взятом из [1]), и знания, полученные на прошлом занятии, посвященном изучению интерфейсов нам обязательно помогут!

Листинг 1. Файл Chorus.java - хор "Поющие животные"

interface VoiceBehavior {
        void voice();
}

class Dog implements VoiceBehavior {
        public void voice () {
                System.out.println("gav-gav!");
        }
}

class Cat implements VoiceBehavior {
        public void voice () {
                System.out.println("myau!");
        }
}

class Cow implements VoiceBehavior {
        public void voice () {
                System.out.println("muu!");
        }
}

public class Chorus {
        public static void main (String [] args) {
                VoiceBehavior [] vb = new VoiceBehavior[3];
                vb[0] = new Dog();
                vb[1] = new Cat();
                vb[2] = new Cow();
               
                for (VoiceBehavior v : vb) {
                        v.voice();
                }
        }
       
}

Программа состоит из определения трех классов животных, которые умеют издавать звуки - собаки, кота и коровы. Метод, издающий звук, предусмотрительно определен в интерфейсе VoiceBehavior (англ. "поведение голоса") и реализован в классах Dog, Cat, Cow, которые и наследуют "поведение" от интерфейса VoiceBehavior. Как определяется интерфейс, почему необходимо методы, унаследованные от интерфейса определять как public читайте в материалах прошлого занятия.

Понятно, что каждое животное издает звуки, приличные своему виду (для этого использован свой метод System.out.println() в каждом классе). Но самое интересное в программе - это использование интерфейса для выполнения метода voice() всеми животными. Для этого создан массив объектов VoiceBehavior, и с помощью оператора new в массив добавлены экземпляры классов Dog, Cat, Cow.
Новым в нашей программе является еще и использование оператора цикла с, так называемым, синтаксисом "foreach":

for (VoiceBehavior v : vb) {
        v.voice();
}

Означает такая запись следующее: для каждого объекта типа VoiceBehavior выполнить метод voice(). Полиморфизм в данном случае проявляется в возможности преобразования типа объекта Dog, Cat, Cow к типу VoiceBehavior (напомним, что все эти классы при их определении наследовали от интерфейса VoiceBehavior).

Вот так, применив полиморфизм в данном примере, мы получили компактную и легко читаемую программу!

В заключении нужно добавить, что для ООП на языке Java понятие интерфейса (interface), вместе с понятием класса, играет существенную роль, для более подробного ознакомления с применением интерфейсов можно порекомендовать не раз приводимую книгу Б.Эккеля "Философия Java" [2]. В примере же, приведенном на прошлом занятии, интерфейсы были использованы только лишь для того, чтобы мы не забыли реализовать некоторые методы для нашего класса. Нам же понятие интерфейса понадобится, чтобы приступить к изучению программирования для ОС Android.

Задание:
* попробуйте в одном из классов "забыть" реализовать метод voice(). (После каждого изменения исходного кода программу нужно перекомпилировать). Проанализируйте полученный результат.

Предыдущее занятие Следущее занятие

Литература
1. Хабибуллин "Самоучитель JAVA 2". -СПб.: БХВ-Петербург, 2005, с.110
2. Брюс Эккель "Философия Java", 4-е издание, Глава 9 "Интерфейсы", с.221

Комментарии

Аватар пользователя Si La

Ну что же, полгода спустя как написал, читается неплохо! Надо бы интерактивности побольше!

Страницы