Интерфейсы
Интерфейсы 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. } }
Локальными переменными называются переменные, объявляемые в каких-либо блоках (повторим еще раз: блоком называется участок кода между двумя фигурными скобками; блоками могут быть: тело метода, блок инициализации и др.). Локальные переменные существуют до тех пор, пока не кончится блок. Как только блок закончится, локальная переменная перестанет существовать.
спасибо за материал.
Может помочь вам перенабрать отсканированные листинги?
Спасибо, если вас не затруднит, буду благодарен