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

38

2.При такой замене мы можем вызывать методы, определенные в суперклассе, и не можем вызывать методы, определенные только в подклассе.

3.Однако если в подклассе переопределены унаследованные методы из суперкласса, будут вызваны переопределенные версии методов подкласса.

·· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

1.11 Апкастинг и даункастинг

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Замена объекта суперкласса объектом подкласса называется

апкастингом (upcasting) или приведением к базовому типу.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Название действия отражает тот факт, что на UML-диаграмме подкласс изображается ниже суперкласса. Апкастинг всегда безопасен, так как объект подкласса обладает всеми свойствами суперкласса и может делать все, что может делать суперкласс. Компилятор проверяет правильность апкастинга и в противном случае выдает ошибку несовместимости типов.

Например,

Student s1=new GraduateStudent();// Компилятор проверяет, является ли указанное значение значением из подкласса

Student s2=new String();//Ошибка компиляции – несовместимые типы

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Даункастинг (downcasting) возвращает замещенный объект к

определению через подкласс. Даункастинг – это приведение объекта суперкласса к объекту подкласса.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Например,

Student s1=new GraduateStudent(“Иванов”);//апкастинг – безопасен GraduateStudent gs1 = (GraduateStudent)s1;// даункастинг требует яв-

ного приведения типов

Даункастинг требует оператора явного приведения типов в форме префиксного оператора (новый_тип). Даункастинг не всегда безопасен и вызывает ошибку ClassCastException во время исполнения, если объект даункастинга не принадлежит правильному подклассу. Объект подкласса может быть заменен суперклассом, но обратное утверждение неверно.

39

1.12Оператор instanceof

ВJava имеется оператор instanceof типа boolean, который возвращает значение true, если объект является экземпляром данного класса. Проще говоря, оператор instanceof нужен, чтобы проверить, был ли объект, на который ссылается переменная a, создан на основе какого-либо класса B.

Оператор instanceof имеет вид:

a instanceof B;

Другими словами, оператор instanceof вернет значение true, если:

1)переменная а хранит ссылку на объект типа B;

2)переменная a хранит ссылку на объект, класс которого унаследован от B;

3)переменная а хранит ссылку на объект, реализующий интерфейс B. Иначе оператор instanceof вернет значение false.

Простой пример из классов-оберток:

Object o = new Integer(3);

boolean isInt = o instanceof Integer;

isInt будет равно true. Объект, на который ссылается переменная o, является объектом класса Integer.

Integer x = new Integer(22);

boolean isInt = x instanceof Integer;

Объект х является Integer, поэтому результатом будет true.

· · · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Вернемся к нашим студентам:

public class Main {

public static void main(String[] args) {

// s1, s2, s3 – объекты, т. е. наши тестовые студенты

Student s1 = new Student();

GraduateStudent s2 = new GraduateStudent();

Student s3 = new GraduateStudent();

//проверяем принадлежность объекта к какому-то классу