Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по объектно-ориентированному программированию..pdf
Скачиваний:
17
Добавлен:
05.02.2023
Размер:
3.39 Mб
Скачать

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()