- •Java - объектно-ориентированный язык
- •Виртуальная Java-машина.
- •Алфавит языка Java
- •Типы данных
- •Числа высокой точности
- •Переменные в Java
- •Объявление переменной
- •Область действия и время жизни переменной
- •Операции в Java
- •Арифметические операции
- •Логические операции
- •Побитовые операции
- •Операции сдвига
- •Тернарный оператор ?:
- •Оператор запятая
- •Одномерные массивы
- •Многомерные массивы
- •Функции
- •Класс Поля и методы
- •Модификаторы доступа
- •Инициализация и очистка
- •Перегрузка методов
- •Ключевое слово this
- •Вызов конструктора из конструктора
- •Использование объектов в качестве параметров
- •Ключевое слово static
- •Спецификатор final
- •Вложенные и внутренние классы
- •Сборщик «мусора»
- •Как работает сборщик мусора
- •Наследование
- •Основы наследования
- •Использование ключевого слова super
- •Использование super для вызова конструктора суперкласса
- •Использование super для доступа к скрытым членам суперкласса
- •Конструкторы при наследовании
- •Динамическая диспетчеризация методов
- •Абстрактные классы
- •Использование final с наследованием
- •Использование final для отказа от переопределения
- •Использование final для отмены наследования
- •Класс Object
- •Пакеты и интерфейсы Пакеты
- •Оператор package
- •Оператор import
- •Уровни доступа.
- •Интерфейсы
- •Оператор implements
- •Частичные реализации
- •“Множественное” наследование в Java
- •Конфликты имен при комбинировании интерфейсов
- •Расширение интерфейса
- •Группировка констант
- •Инициализирование полей в интерфейсах
- •Вложенные интерфейсы
- •Стандартный ввод/вывод
- •Чтение из стандартного ввода
- •Замена System.Out на PrintWriter
- •Первое приложение Java
- •Исключительные ситуации. Обработка исключений
- •Типы исключений
Частичные реализации
Как отмечалось выше, если класс, реализующий интерфейс, реализует не все методы этого интерфейса, то этот класс должен быть объявлен как абстрактный (abstract). Например:
ПРИМЕР
“Множественное” наследование в Java
Интерфейс, это не просто одна из форм абстрактного класса. В Java можно реализовать наследование «от многих», но только один из этих классов может иметь реализацию, так что проблемы, возникающие в C++, не возникают в Java, при комбинировании множества интерфейсов.
Наследовать не от интерфейса можно только от одного. Все остальные из элементов базового класса должны быть интерфейсами. Имена всех интерфейсов записываются после ключевого слова implements и разделяется запятыми. Можно использовать любое количество интерфейсов, каждый из них становится независимым типом, к которому в последствии можете привести объект. Пример демонстрирует комбинирование класса с несколькими интерфейсами для создания нового класса:
interface Intrf_A {
void fun_A();
}
interface Intrf_B {
void fun_B();
}
interface Intrf_C {
void fun_C();
}
class A {
public void fun_A () {}
}
class B extends A implements Intrf_A, Intrf_B, Intrf_C {
public void fun_B () {}
public void fun_C () {}
}
public class D {
static void t(Intrf_A x) { x. fun_A (); }
static void u(Intrf_B x) { x. fun_B (); }
static void v(Intrf_C x) { x. fun_C (); }
static void w(A x) { x. fun_A (); }
public static void main(String[] args) {
B h = new B();
t(h); // Treat - CanFight
u(h); // Treat - CanSwim
v(h); // Treat - CanFly
w(h); // Treat - ActionCharacter
}
} ///:~
В этом примере, класс B комбинирует конкретный класс A с интерфейсами Intrf_A, Intrf_B и Intrf_C. При этом класс должен быть указан первым, а только затем интерфейсы, в противном случае компилятор выдаст сообщение об ошибке.
Заметим, что сигнатура fun_A() одинаковая и в интерфейсе Intrf_A и в классе A, но fun_A() не определена в В. От интерфейса можно наследовать, но тогда получается еще один интерфейс. Для создания же класса на основе интерфейса он должен иметь все определения. И хотя класс В не предоставляет определения для fun_A(), это определение появляется автоматически вместе с классом А и создать объект от класса В становится возможным.
В классе D есть несколько методов, которые воспринимают в качестве аргументов различные интерфейсы и конкретные классы. Когда объект класса В уже создан, он может быть передан в качестве параметра в любой их этих методов, что в свою очередь означает, что он может быть приведен к базовому типу (к любому из вышеописанных интерфейсов).
Необходимо отметить причину использования интерфейсов. Во-первых, возможность приведения к более, чем одному базовому типу. Во-вторых, в том же, в чем и причина использования абстрактных базовых классов: предотвращение создания объектов этого класса и понимания, что это всего лишь интерфейс. Возникает вопрос: что же лучше использовать? Интерфейс или абстрактный класс? Интерфейс содержит преимущества абстрактного класса и интерфейса, так что если нужно создать базовый класс без любых определений методов или переменных, то интерфейс предпочтительнее абстрактного класса. Если, же этот класс должен иметь определения методов и переменных, только тогда предлагается реализовать его как абстрактный класс или если это необходимо как обычный класс.