Иногда полезно распознавать тип объекта во время выполнения. Например, можно иметь один поток выполнения для генерации различных типов объектов, а другой — для их обработки. В этой ситуации обрабатывающему процессу полезно было бы знать тип каждого объекта, принимаемого на обработку. Другая ситуация, в которой знание типа объекта во время выполнения очень важно, — это приведение типов (cast). В Java недопустимое приведение вызывает ошибку времени выполнения. Много недопустимых приведений можно перехватить во время компиляции. Однако операции приведения, связанные с типами объектов (т. е. с иерархиями классов), могут оказаться недопустимыми и могут быть обнаружены только во время выполнения. Например, суперкласс с именем А может иметь два подкласса: B и C. Приведение объектов B или C к типу А — законно, а приведение B-объекта к типу C (или, наоборот, C-объекта к типу B) — нет. Поскольку объект типа А может ссылаться как на объект B, так и на объект C, то каким образом вы можете определить (во время выполнения), на объект какого типа фактически ссылается А-объект перед попыткой приведения его типа к C? Это может быть объект любого типа — А, B или C. Если это — объект типа B, будет выброшено исключение (времени выполнения). Для ответа на этот вопрос Java использует специальную операцию — instanceof. Операция instanceof имеет следующую общую форму:
object instanceof type
где object— экземпляр класса; type — класс (как тип). Если object-операнд имеет тип или его тип может быть приведен к типу, указанный в type-операнде, то результат операции instanceof имеет значение true. Иначе, ее результат — false. Таким образом, instanceof — это средство, с помощью которого программа может получить информацию о типе объекта во время выполнения. Следующая программа демонстрирует операцию instanceof: