Добрый вечер, я тупой не до конца понимаю че происходит в строке Player player = (Player) person; Объясните плиз
Внизу кусок кода
public static void haveFun(Person person) {
if(person instanceof Player){
Player player = (Player) person;
player.play();
}
if(person instanceof Dancer){
Dancer dancer = (Dancer) person;
dancer.dance();
}
}
interface Person {
}
static class Player implements Person {
void play() {
System.out.println("playing");
}
}
static class Dancer implements Person {
void dance() {
System.out.println("dancing");
}
}
Alexander Ponomarev
17 уровень
Поясните за танцора
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
27 октября 2019, 14:57
Person-ы бывают разные: бывают танцоры, бывают певцы и т.д.
Когда у тебя переменная обозначена как Person, в нее можно положить любой из "подвидов", вернее сказать реализаций Person. И обращаться с такойпеременной можно, как с любым Person. Если тебе нужно обратиться с этим объектом не как с персоной, а как конкретно с танцором, ты должен указать, что ты знаешь, что там танцор, и выполнить приведение. Проведенный к более узкому классу объект можно положить в переменную этого класса (Dancer), и к объекта этого класса соответственно уже будет доступ к методам танцора.
Если изначально поместить в переменную объект одного класса, а привести к другому классу, то возникнет исключение приведение класса. Чтобы его предотвратить, сначала выполняется проверка, можно ли это приведение выполнить (if (foo instanceof SomeClass)).
+2
Alexander Ponomarev
27 октября 2019, 14:59
Так Person получается какая то особенная переменная?
0
Wladyslaw Java Developer Master
27 октября 2019, 15:22
Это просто более абстрагированная переменная.
Есть Dancer, он - Dancer. Но, одновременно, он еще и Person, потому как реализует интерфейс.
Если бы он наследовал от другого класса, то он бы был еще и сущностью класса-предка. Это называется зависимость "IS-A". В данном случае "Dancer IS-A Person".
Из-за этого, переменная типа Person может ссылаться на объект типа Dancer.
Но, тип переменной определяет "интерфейс" к объекту, то-есть доступные методы, например.
Переменная типа Person ничего не знает о методах класса Dancer, она знает только о тех методах, которые объявлены в интерфейсе Person. Которые гарантированно будут в любом классе который имплементит этот интерфейс.
Если нужно вызвать специфические методы класса Dancer - необходимо привести типы. Перейти от более абстрактного типа - к менее абстрактному.
Но, перед этим не помешает проверить объект какого типа фактически лежит в памяти по ссылке person, для того и instanceof
+2
Alexander Ponomarev
27 октября 2019, 15:33
Я вроде понял за Preson, спасибо))0
0