Меню сайта

Урок 8. Пакеты и интерфейсы в Java ( 2 часть )

Интерфейсы

Интерфейсы Java созданы для поддержки динамического выбора (resolution) методов во время выполнения программы. Интерфейсы похожи на классы, но в отличие от последних у интер­фейсов нет переменных представителей, а в объявлениях методов отсут­ствует реализация. Класс может иметь любое количество интерфейсов. Все, что нужно сделать — это реализовать в классе полный набор методов всех интерфейсов. Сигнатуры таких методов класса должны точно совпадать с сигнатурами методов реализуемого в этом классе интерфейса. Интер­фейсы обладают своей собственной иерархией, не пересекающейся с классовой иерархией наследования. Это дает возможность реализовать один и тот же интерфейс в различных классах, никак не связанных по линии иерархии классового наследования. Именно в этом и проявляется главная сила интерфейсов. -Интерфейсы являются аналогом механизма множественного наследования в -C++, но использовать их намного легче.

Оператор interface

Определение интерфейса сходно с определением класса, -отличие со­стоит в том, что в интерфейсе отсутствуют объявления данных и кон­структоров. Общая форма интерфейса приведена ниже:

interface имя {

тип_результата имя_метода1(список параметров)-

тип имя_final1-переменной = значение-

}

Обратите внимание — у объявляемых в интерфейсе ме­тодов отсутствуют операторы тела. Объявление методов завершается сим­волом — (точка с запятой). В интерфейсе можно объявлять и переменные, при этом они не­явно объявляются final — -переменными. Это означает, что класс реализа­ции не может изменять их значения. Кроме того, при объявлении переменных в интерфейсе их обязательно нужно инициализировать кон­стантными значениями. Ниже приведен пример определения интерфейса, содержащего единственный метод с именем callback и одним параметром типа int.

interface Callback {

void callback(int param)-

}

Оператор implements

Оператор implements — это дополнение к определению класса, реали­зующего некоторый интерфейс(ы).

class имя_класса [extends суперкласс]

[implements интерфейс0 [, интерфейс1…]] { тело класса }

Если в классе реализуется несколько интерфейсов, то их имена раз­деляются запятыми. Ниже приведен пример класса, в котором реализуется определенный нами интерфейс:

class Client implements Callback {

void callback(int p) {

System.out.println(«callback called with » + p)-

} }

В очередном примере метод callback интерфейса, определенного ранее, вызывается через переменную — -ссылку на интерфейс:

class TestIface {

public static void main(String args[]) { Callback с = new client()-

c.callback(42)-

}}

Ниже приведен результат работы программы:

С:&#92-&gt- Java TestIface

callback called with 42

Переменные в интерфейсах

Интерфейсы можно использовать для импорта в различные классы со­вместно используемых констант. В том случае, когда вы реализуете в классе какой-либо интерфейс, все имена переменных этого интерфейса будут видимы в классе как константы. Это аналогично использованию файлов-заголовков для задания в С и C++ констант с помощью директив #define или ключевого слова const -в -Pascal / Delphi.

Если интерфейс не включает в себя методы, то любой класс, объяв­ляемый реализацией этого интерфейса, может вообще ничего не реали­зовывать. Для импорта констант в пространство имен класса предпочти­тельнее использовать переменные с модификатором final. В приведенном ниже примере проиллюстрировано использование интерфейса для со­вместно используемых констант.

import java.util.Random-

interface SharedConstants { int NO = 0-

int YES = 1-

int MAYBE = 2-

int LATER = 3-

int SOON = 4-

int NEVER = 5- }

class Question implements SharedConstants {

Random rand = new Random()-

int ask()
{

int prob = (int) (100 * rand.nextDouble())-

if (prob &lt- 30)

return NO- // 30% else if (prob &lt- 60)

return YES- // 30% else if (prob &lt- 75)

return LATER- // 15% else if (prob &lt- 98)

return SOON- // 13% else

return NEVER- // 2% } }

class AskMe implements SharedConstants {

static void answer(int result) {

switch(result) {

case NO:

System.out.println(«No»)-

break-

case YES:

System.out.println(«Yes»)-

break-

case MAYBE:

System.out.println(«Maybe»)-

break-

case LATER:

System.out.println(«Later»)-

break-

case SOON:

System.out.priniln(«Soon»)-

break-

case NEVER:

System.out.println(«Never»)-

break-

} }

public static void main(String args[]) {

Question q = new Question()-

answer(q.ask())-

answer(q.ask())-

answer(q.askO)-

answer(q.ask())-

} }

Обратите внимание на то, что результаты при разных запусках програм­мы отличаются, поскольку в ней используется класс генерации случай­ных чисел Random пакета java.util. Описание этого пакета приведено в -главе 12.

С:&#92-&gt- Java AskMe

Later

Scon

No

Yes

Использование пакетов

Теперь вы обладаете полной информацией для создания собственных пакетов классов. Легко понимае­мые интерфейсы позволят другим программистам использовать ваш код для самых различных целей. Инструменты, которые вы приобрели, изу­чив эту и предыдущую главы, должны вам помочь при разработке любых объектно-ориентированных приложений. В дальнейшем вы позна­комитесь с некоторыми важными специфическими свойствами Java, ко­торые представлены в виде классов в пакете java.lang.

Категория: Обучение Java | Дата: 15.04.13

Меню раздела
Блок