Интерфейсы в Java

Интерфейсы

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

Интерфейс — это структура данных, которая может содержать поля, представленные в виде именованных констант (ключевое слово final тут обычно не указывается, так как поля — это всегда именованные константы) и объявления методов. Интерфейсом могут расширяться многие классы. Интерфейс может сам расширяться несколькими интерфейсами. Заметим, что интерфейс могут использовать сразу несколько классов, независимых друг от друга.

У интерфейса могут быть следующие модификаторы.
• public (если он есть, то интерфейс доступен отовсюду, если его нет — доступен только в данном пакете).
• abstract (так как интерфейс всегда абстрактный, то модификатор обычно опускается).
• strictfp— все позже реализуемые методы должны будут работать с числами с плавающей точкой аналогично на всех машинах Java.
Приведем пример простого интерфейса, а также класса, который его наследует (листинг 4.13).

Листинг 4.13.
Пример простого интерфейса и класса, который его наследует

interface Apple {
    String red = "red";
    String yellow = "yellow";
    String green = "green";
}
interface Tangerine {
    String orange = "orange";
}
interface Fruits extends Apple, Tangerine {
    String fruit1 = "Apple";
    String fruit2 = "Tangerine";
    void setFruit(int number1, int number2);
    String getFruit();
}
class MyFruits implements Fruits {
    String color;
    String name;
    private String getColor() {
        return color;
    }
    private void setColor(int number) {
        switch (number) {
            case 0:
                this.color = this.red;
                break;
            case 1:
                this.color = this.yellow;
                break;
            default:
                this.color = this.green;
        }
    }

    public String getFruit() {
        String s = "Fruit: " + this.name + "Color: " + getColor();
        return s;
    }

    public void setFruit(int number1, int number2) {
        switch (number1) {
            case 0:
                this.name = this.fruit1;
                setColor(number2);
                break;
            default:
                this.name = this.fruit2;
                this.color = this.orange;
                break;
        }
    }

    public static void main(String[] args) {
        MyFruits my1 = new MyFruits();
        my1.setFruit(0, 2);
        System.out.println(my1.getFruit());
        MyFruits my2 = new MyFruits();
        my2.setFruit(1, 0);
        System.out.println(my2.getFruit());
    }
}

 

Можно объявить переменную с типом данных, являющимся наименованием интерфейса. Она может ссылаться на объект класса, который реализует интерфейс, и может вызывать методы, которые объявлены в интерфейсе, а реализованы в классе. Чтобы сделать такую ссылку, необходимо в качестве типа данных ссылки указать наименование интерфейса, а после ключевого слова new указать имя конструктора класса (листинг 4.14).

Листинг 4.14.
Объявление переменной с типом данных, являющимся наименованием интерфейса

interface Fruit {
    void setName(String s);
}
class Apple implements Fruit {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String s) {
        this.name = s;
    }

    public static void main(String[] args) {
        Fruit my1 = new Apple();
        my1.setName("Apple");
        System.out.println(my1.getName());
        // A это ошибка! Нет метода getName() в интерфейсе Fruit. 
    }
}

 

Локальными переменными называются переменные, объявляемые в каких-либо блоках (повторим еще раз: блоком называется участок кода между двумя фигурными скобками; блоками могут быть: тело метода, блок инициализации и др.). Локальные переменные существуют до тех пор, пока не кончится блок. Как только блок закончится, локальная переменная перестанет существовать.

< Предыдущая       Оглавление       Следующая >

Комментарии: 5
  1. Zakhar40

    спасибо за материал.
    Может помочь вам перенабрать отсканированные листинги?

    1. admin (автор)

      Спасибо, если вас не затруднит, буду благодарен

Добавить комментарий