- •Введение
- •1 Концепции объектно-ориентированного программирования
- •1.1 Классы и объекты
- •1.2 Геттеры и сеттеры
- •1.3 Перегрузка методов
- •1.4 Ключевые слова this и super
- •1.5 Метод toString()
- •1.6 Конструкторы
- •1.7 Определение класса в Java
- •1.8 Принципы ООП
- •1.8.1 Абстракция
- •1.8.2 Инкапсуляция
- •1.8.3 Наследование
- •1.8.4 Полиморфизм
- •1.9 Переопределение методов
- •1.10 Подстановка
- •1.11 Апкастинг и даункастинг
- •1.13 Абстрактные классы и интерфейсы
- •1.13.1 Абстрактные классы
- •1.13.2 Интерфейсы
- •2 Типы отношений между классами и объектами
- •2.1 Ассоциация
- •2.2 Агрегация
- •2.3 Композиция
- •2.4 Наследование
- •3 Введение во фреймворк «Коллекции». Обобщения
- •3.1 Коллекции
- •3.2 Перебор элементов коллекций
- •3.3 Обобщения
- •3.3.2 Дженерик-методы и универсальные конструкторы
- •3.3.3 Подстановочные символы (wildcard)
- •4 Потоки ввода-вывода и потоки выполнения. Многопоточное программирование
- •4.1 Потоки
- •InputStream
- •OutputStream
- •Символьные потоки
- •Специализированные потоки
- •Файловые потоки
- •Стандартные потоки ввода-вывода
- •Чтение из стандартного ввода
- •Ввод с консоли
- •Форматированный вывод
- •Класс File
- •Методы класса File
- •4.2 Сериализация и десериализация объектов
- •4.2.1 Сериализация
- •4.2.2 Десериализация
- •4.2.3 Исключение данных из сериализации
- •4.2.4 Сериализация статических полей
- •4.2.5 Сериализация с массивом или коллекцией
- •4.2.6 Сериализация Java с наследованием
- •4.2.7 Сериализация Java с агрегированием
- •4.2.8 SerialVersionUID
- •4.3 Потоки выполнения
- •4.4. Жизненный цикл потока
- •4.5 Многопоточность
- •4.5.1 Главный поток
- •4.5.2 Создание и завершение потоков
- •4.5.3 Завершение потока
- •4.5.4 Управление приоритетами
- •4.5.5 Синхронизация потоков
- •4.5.6 Состояния потока
- •4.5.7 Блокировка
- •5 Лямбда-выражения
- •Заключение
- •Литература
- •Глоссарий
40
System.out.println(s1 instanceof Student); System.out.println(s1 instanceof GraduateStudent);
System.out.println(s2 instanceof Student); System.out.println(s2 instanceof GraduateStudent);
System.out.println(s3 instanceof Student); System.out.println(s3 instanceof GraduateStudent);
}
}
Теперь рассмотрим результат на консоли (рис. 1.14).
Рис. 1.14 – Результат работы метода Instanceof |
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · |
Конструктор базового класса, если он есть, всегда вызывается первым при |
создании любого объекта. Instanceof руководствуется именно этим принци- |
пом, когда пытается определить, был ли объект А создан на основе класса Б. Если |
конструктор базового класса вызван, значит никаких сомнений быть не может. |
Конструктор GraduateStudent не вызывался при создании Student, |
что логично. Ведь GraduateStudent – потомок Student, а не предок. По- |
этому тут будет результат false. |
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · |
Мы часто используем оператор instanceof перед пониже- |
нием, чтобы проверить, принадлежит ли объект определенному ти- |
пу. Оператор instanceof проверяет именно происхождение объ- |
екта, а не переменной. |
·· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
1.13Абстрактные классы и интерфейсы
1.13.1 Абстрактные классы
По мере изучения особенностей наследования объектов в языке Java может понадобиться создать класс, характеризующий объект обобщенно, на базе
41
которого впоследствии можно создать подклассы. Подклассы будут уточнять свойства объектов, формируя таким образом иерархию классов.
Самый общий класс в данном случае будет абстрактным. Он формирует «внешнюю оболочку» для подклассов, и только подклассы наполняют эту оболочку конкретным содержанием – кодом, реализующим задачи программы. Абстрактный класс, как правило, содержит один или несколько абстрактных методов.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Абстрактный метод (abstract method) – это метод, реализа-
ция которого неизвестна на данный момент. Известно только то, что этот метод должен быть у всех наследников.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Перед таким абстрактным методом указывается abstract, а заканчивается описание сигнатуры метода в классе традиционно – точкой с запятой:
abstract void method();
Абстрактный метод не может быть private, native, static, final. |
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · |
Класс, который содержит хотя бы один абстрактный ме- |
тод, называется абстрактным. Иначе: абстрактный класс – это |
класс, экземпляр которого нельзя создать. |
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · |
Класс, содержащий один или несколько абстрактных методов, должен |
быть также объявлен как абстрактный с использованием того же спецификатора |
abstract в объявлении класса. |
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · |
Важно! Абстрактный класс должен быть публичным. |
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · |
Поскольку абстрактный класс не определяет реализацию полностью, у не- |
го не может быть объектов. Следовательно, попытка создать объект абстрактно- |
го класса с помощью оператора new приведет к возникновению ошибки во время |
компиляции. Подкласс, наследующий абстрактный класс, должен реализовать |
все абстрактные методы суперкласса. В противном случае он также должен быть |
определен как абстрактный. Таким образом, атрибут abstract наследуется до |
тех пор, пока не будет достигнута полная реализация класса. |
42
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Абстрактные классы реализуют на практике один из принци-
пов ООП – полиморфизм [4].
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · · · |
|
Пример · · · · · · · · · · · · · · · · · · · · · · · · · |
|
|
|
Рассмотрим пример иерархии класса Person (рис. 1.15).
Рис. 1.15 – Иерархия класса Person
public abstract class Person
{
private String name; private int mark;
public Person(String name) { this.name = name;
}
public Person(String name,int mark) { this.name = name; this.mark=mark;
}
public Person(int mark) { this.mark = mark;
}
public Person () {}
public abstract String getDescription();
}
public class Student extends Person {
43
private String major; private int mark; private String name;
public Student(String name, int mark, String major) {
this.name=name; this.mark=mark; this.major=major;
}
public Student(String name) { this.name=name;
}
public Student(int mark) { this.mark=mark;
}
public Student() {
}
@Override
public String getDescription() {
return this.name + " обучается на " + this.major;
}
}
В главном методе создадим объект s3, для которого вызовем уже переопределенный метод getDescription():
Student s3 = new Student("Иванов",5,"ФСУ");
System.out.println(s3.getDescription());
При выполнении программы на консоли увидим следующий результат
(рис. 1.16).
Рис. 1.16 – Вызов переопределенного метода getDescription()