Вопросы 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, поскольку типы объектов обычно известны заранее. Но этот оператор может пригодиться при разработке обобщенных процедур, оперирующих объектами из сложной иерархии классов. Хотя обычно там, где код должен работать с параметрами различного типа, принято использовать дженерики.
Комментарии