- Возможность вызвать метод определяется по типу ссылки - Ссылку нельзя привести к произвольному типу - Сслыку можно привести к более общему типу - Ссылку можно привести к реальному типу объекта - Оператор `instanceof` проверяет тип объекта ## Оператор `instanceof` ```Java // ColorSquare extends Square ColorSquare s = new ColorSquare(); s instanceof ColorSquare // true s instanceof Square // true s instanceof String // false ``` ## Upcasting Приведение к суперклассу ```Java Square x = s; x.area(); // OK x.getColor(); // Ошибка - нет такого метода ``` ## Downcasting Приведение к реальному типу Если изначально был таким ```Java ColorSquare s = new ColorSquare(); Square x = s; x.area(); // OK ColorSquare y = (ColorSquare) x; y.getColor(); // OK ``` А вот если нет ```Java Square s = new ColorSquare(); Square x = s; x.area(); // OK ColorSquare y = (ColorSquare) x; // ClassCastException ``` ## Pattern Matching Перед даункастом лучше проверить тип через `instanceof` ```Java ... if (x instanceof ColorSquare) { ColorSquare y = (ColorSquare) x; y.getColor(); // OK } ``` Либо более короткий синтаксис ```Java ... if (x instanceof Colorsquare y) { y.getColor(); // OK } ``` То есть после апкаста джава не забывает какой тип был изначально