Реклама:

После оператора interface записывается имя интерфейса, потом может стоять слово extends и список интерфейсов-предков через запятую. Таким образом, интерфейсы могут порождаться от интерфейсов, образуя свою, независимую от классов, иерархию, причем в ней допускается множественное наследование интерфейсов. В этой иерархии нет корня, общего предка.

Затем, в фигурных скобках, записываются в любом порядке константы и заголовки методов. Можно сказать, что в интерфейсе все методы абстрактные, но слово abstract писать не надо. Константы всегда статические, но слова static и final указывать не нужно. Все константы и методы в интерфейсах всегда открыты, не надо даже .указывать модификатор public. Общий синтаксис объявления интерфейса следующий:

interface Имя {

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

тип имя переменной1 = значение;

}

Таким образом, интерфейс - это только схема. В нем указано, что делать, но не указано, как это делать. Для использования интерфейса создается класс, который реализует интерфейс. Реализация (implementation) интерфейса - это класс, в котором содержатся методы и константы, объявленные в одном или нескольких интерфейсах.

Для задания реализации интерфейсов необходимо в заголовке класса после его имени записывать оператор implements и, через запятую, перечислить имена интерфейсов. Объявленные в интерфейсе переменные неявно считаются как final-переменные. Это означает, что класс реализации не может изменить их значения. Поэтому интерфейсы можно использовать для импорта в различные классы совместно используемых констант.

Пример. Система управления светофором

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; case Lights.ERROR: System.err.println(«Time Error»); break; default: System.err.println(«Unknown light.»); return;

}

}

}

Здесь, в интерфейсе Lights, определены константы, общие для всего проекта. Класс Timer реализует этот интерфейс и использует константы напрямую как свои собственные. Метод shift о этого класса подает сигналы переключения светофору с разной задержкой в зависимости от цвета. Задержку осуществляет метод sleep() класса Thread из стандартной библиотеки, которому передается время задержки в миллисекундах. Этот метод нуждается в обработке исключений try{} catch() {}.


⇐ Предыдущая страница| |Следующая страница ⇒