The instanceof Operator
The instanceof operator is used to test whether an object is an instance of a specific class, subclass, or interface. It returns true or false and is essential for safe type casting.
Basic Syntax
The instanceof operator checks if an object is of a particular type:
object instanceof ClassName
Returns true if the object is an instance of the specified class (or its subclasses), otherwise false.
String text = "Hello";
Integer num = 42;
System.out.println(text instanceof String); // true
System.out.println(num instanceof Integer); // true
System.out.println(text instanceof Object); // true (String IS-A Object)
instanceof with Inheritance
The instanceof operator checks the entire inheritance hierarchy. If a class extends another, instanceof returns true for both the class and its parent.
class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }
Dog myDog = new Dog();
System.out.println(myDog instanceof Dog); // true
System.out.println(myDog instanceof Animal); // true (Dog IS-A Animal)
System.out.println(myDog instanceof Object); // true (Everything IS-A Object)
System.out.println(myDog instanceof Cat); // false
Safe Type Casting with instanceof
The primary use of instanceof is to ensure safe downcasting. Without it, you risk a ClassCastException at runtime.
Animal animal = new Dog(); // Upcasting (safe)
// Unsafe downcasting without check
// Dog dog = (Dog) animal; // Works here, but risky!
// Safe downcasting with instanceof
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // Safe to cast
dog.bark();
}
Animal animal = new Cat();
Dog dog = (Dog) animal; // ClassCastException at runtime!
Pattern Matching for instanceof (Java 16+)
Java 16 introduced pattern matching, which combines the type check and cast in one step:
// Traditional way (before Java 16)
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark();
}
// Pattern matching (Java 16+)
if (animal instanceof Dog dog) {
// 'dog' is automatically cast and available here
dog.bark();
}
instanceof and null
The instanceof operator safely handles null values - it always returns false for null.
String str = null;
System.out.println(str instanceof String); // false (not true, not exception!)
System.out.println(str instanceof Object); // false
// This makes instanceof perfect for null-safe checks
if (str instanceof String) {
// This block won't execute if str is null
System.out.println(str.length());
}
instanceof with Interfaces
You can also use instanceof to check if an object implements a particular interface:
interface Flyable {
void fly();
}
class Bird implements Flyable {
public void fly() {
System.out.println("Bird is flying");
}
}
Bird bird = new Bird();
System.out.println(bird instanceof Flyable); // true
System.out.println(bird instanceof Bird); // true
Click Run to execute your code
Practical Use Cases
- Processing heterogeneous collections: When you have a list of parent type objects that may be different subclass types
- equals() method implementation: Checking if the compared object is of the same type
- Factory patterns: Determining object types before processing
- Event handling: Checking event source types
// Example: Processing different types
for (Object obj : mixedList) {
if (obj instanceof String s) {
System.out.println("String length: " + s.length());
} else if (obj instanceof Integer i) {
System.out.println("Integer value: " + i);
} else if (obj instanceof Double d) {
System.out.println("Double value: " + d);
}
}
Common Mistakes
- Casting without checking: Always use instanceof before downcasting to avoid ClassCastException
- Overusing instanceof: Excessive use may indicate poor design - consider polymorphism instead
- Forgetting null case: While instanceof handles null safely, explicit null checks may be clearer in some cases
Summary
instanceoftests if an object is an instance of a class or interface- Returns
truefor the exact class AND all parent classes/interfaces - Returns
falsefor null (safe, no exception) - Essential for safe downcasting to avoid ClassCastException
- Java 16+ pattern matching combines check and cast:
if (obj instanceof Type t)
Enjoying these tutorials?