Автор: Widowmaker1984

Вопросы 43, 46 (преобразования ссылочных типов)

"Какие преобразования называются нисходящими и восходящими?"
"Зачем нужен оператор instanceof?"

1. Приведение типов (преобразование типов) — преобразование значения переменной одного типа в значение другого типа.

1.1. Преобразование от от подкласса внизу к суперклассу вверху иерархии называется восходящим (upcasting). Восходящее преобразование всегда безопасно, так как это переход от конкретного типа к более общему типу. Такое преобразование осуществляется автоматически (потому что объект подкласса также представляет собою объект суперкласса).

Object tom = new Person("Tom");

скрытый текст1.2. Обратное не всегда верно. Поэтому нисходящее преобразование (downcasting) от суперкласса к подклассу автоматически не выполняется. В этом случае надо явно использовать операцию преобразования типов.

// нисходящее преобразование от Object к типу Employee
Employee emp = (Employee)sam;

1.2.1. Но при попытке преобразования к типу Employee мы можем получить ошибку при выполнении, если переменная sam — это не ссылка не объект Employee . Нередко данные приходят извне, и мы можем точно не знать, какой именно объект они представляют. Соответственно, возникает большая вероятная столкнуться с ошибкой. И перед тем, как провести преобразование типов, мы можем проверить, возможно ли приведение с помощью оператора instanceof.

2. Выражение sam instanceof Employee проверяет, является ли переменная sam объектом типа Employee. Общая форма: [CсылкаНаОбъект] instanceof [Тип].

2.1. Здесь CсылкаНаОбъект обозначает ссылку на экземпляр класса, а Тип- конкретный тип этого класса. Если ссылка_на_объект относится к указанному типу или может быть приведена к нему (по сути является ли объект экземпляром указанного класса или его потомком), то вычисление оператора instanceof дает в итоге логическое значение true, иначе - логическое значение false.

2.2. Большинство программ не нуждается в операторе instanceof, поскольку типы объектов обычно известны заранее. Но этот оператор может пригодиться при разработке обобщенных процедур, оперирующих объектами из сложной иерархии классов. Хотя обычно там, где код должен работать с параметрами различного типа, принято использовать дженерики.

Комментарии


Лучшее   Правила сайта   Вход   Регистрация   Восстановление пароля

Материалы сайта предназначены для лиц старше 16 лет (16+)