Java instanceof Operator: Usage and Examples
Table of Content:
Note: If you are beginner to java, skip this topic and return to it after class, object, inheritance, polymorphism concepts.
In Java, instanceof operator is used to check the type of an object at runtime.
It is the means by which your program can obtain run-time type information about an
object. instanceof operator is also important in case of casting
object at runtime. instanceof operator return boolean value, if an
object reference is of specified type then it
return true otherwise false.
with a simple words The java instanceof operator is used to test whether the object is an instance
of the specified type (class or subclass or interface).
The instanceof in java is also known as type comparison operator because it compares the
instance with type. It returns either true or false. If we apply the instanceof operator with any
variable that has null value, it returns false.
The instanceof operator has this general form:
objref instanceof type
Here, objref is a reference to an instance of a class, and type is a class type. If objref is of the
specified type or can be cast into the specified type, then the instanceof operator evaluates to
true. Otherwise, its result is false. Thus, instanceof is the means by which your program can
obtain run-time type information about an object.
instanceof is a Java keyword. Every letter in a Java keyword is in lowercase.
Example of instanceOf
Program:
Let's see the simple example of instanceof operator where it tests the current class.
public class TestInstance
{
public static void main(String[] args)
{
TestInstance t= new TestInstance();
System.out.println(t instanceof TestInstance);
}
}
Output:
true Press any key to continue . . .
Another example of java instanceof operator
Program:
Let's see the simple example of instanceof operator where it tests the current class.
class Human{
}
class Woman extends Human{//Woman inherits Animal
public static void main(String args[]){
Woman d=new Woman();
System.out.println(d instanceof Human);//true
}
}
Output:
true Press any key to continue . . .
An object of subclass type is also a type of parent class. In this example, if Woman extends Human then object of Woman can be referred by either Woman or Human class.
instanceof in java with a variable that have null value
If we apply instanceof operator with a variable that have null value, it returns false.
Let's see the example given below where we apply instanceof operator with the variable that have null value.
Program:
class Woman{
public static void main(String args[]){
Woman p=null;
System.out.println(p instanceof Woman);//false
}
}
Output:
false Press any key to continue . . .
Casting Objects and the instanceof Operator
One object reference can be typecast into another object reference. This is called casting object.
When Child class type refers to the object of Parent class, it is known as downcasting.
If we perform it directly, compiler gives Compilation error. If you perform it by typecasting,
ClassCastException is thrown at runtime. But if we use instanceof operator, downcasting is possible.
Child c = new Parent();//Compilation error
If we perform downcasting by typecasting, ClassCastException is thrown at runtime.
Child d=(Child)new Parent(); //Compiles successfully but ClassCastException is thrown at runtime
Solution downcasting with instanceof
Program:
Let's see the example, where downcasting is possible by instanceof operator.
class Parent { }
class Child extends Parent {
static void method(Parent a) {
if(a instanceof Child){
Child d=(Child)a;//downcasting
System.out.println("solve downcasting performed");
}
}
public static void main (String [] args) {
Parent a=new Child();
Child.method(a);
}
}
Output:
solve downcasting performed Press any key to continue . . .
Downcasting without the use of java instanceof
Downcasting can also be performed without the use of instanceof operator as displayed in the following example:
Program:
class Parent {
}
class Child extends Parent {
static void method(Parent a) {
Child d=(Child)a;//downcasting
System.out.println("downcasting performed");
}
public static void main (String [] args) {
Parent a=new Child();
Child.method(a);
}
}
Output:
downcasting performed Press any key to continue . . .
Let's take closer look at this, actual object that is referred by a, is an object of Child class. So if we downcast it, it is fine. But what will happen if we write:
Parent a=new parent(); Child.method(a); //Now ClassCastException but not in case of instanceof operator
Example of downcasting with instanceof operator
Program:
class Parent{ }
public class Child extends Parent
{
public void check()
{
System.out.println("Sucessfull Casting");
}
public static void show(Parent p)
{
if(p instanceof Child)
{
Child b1=(Child)p;
b1.check();
}
}
public static void main(String[] args)
{
Parent p=new Child();
Child.show(p);
}
}
Output:
Sucessfull Casting Press any key to continue . . .
Another example of instanceof operator
Program:
class Parent{}
class Child1 extends Parent{}
class Child2 extends Parent{}
class MainClass
{
public static void main(String[] args)
{
Parent p =new Parent();
Child1 c1 = new Child1();
Child2 c2 = new Child2();
System.out.println(c1 instanceof Parent); //true
System.out.println(c2 instanceof Parent); //true
System.out.println(p instanceof Child1); //false
System.out.println(p instanceof Child2); //false
p = c1;
System.out.println(p instanceof Child1); //true
System.out.println(p instanceof Child2); //false
p = c2;
System.out.println(p instanceof Child1); //false
System.out.println(p instanceof Child2); //true
}
}
Output:
true true false false true false false true Press any key to continue . . .
Important example of instanceof operator
Program:
// Demonstrate instanceof operator.
class A {
int i, j;
}
class B {
int i, j;
}
class C extends A {
int k;
}
class D extends A {
int k;
}
class InstanceOf {
public static void main(String args[]) {
A a = new A();
B b = new B();
C c = new C();
D d = new D();
if(a instanceof A)
System.out.println("a is instance of A");
if(b instanceof B)
System.out.println("b is instance of B");
if(c instanceof C)
System.out.println("c is instance of C");
if(c instanceof A)
System.out.println("c can be cast to A");
if(a instanceof C)
System.out.println("a can be cast to C");
System.out.println();
// compare types of derived types
A ob;
ob = d; // A reference to d
System.out.println("ob now refers to d");
if(ob instanceof D)
System.out.println("ob is instance of D");
System.out.println();
ob = c; // A reference to c
System.out.println("ob now refers to c");
if(ob instanceof D)
System.out.println("ob can be cast to D");
else
System.out.println("ob cannot be cast to D");
if(ob instanceof A)
System.out.println("ob can be cast to A");
System.out.println();
// all objects can be cast to Object
if(a instanceof Object)
System.out.println("a may be cast to Object");
if(b instanceof Object)
System.out.println("b may be cast to Object");
if(c instanceof Object)
System.out.println("c may be cast to Object");
if(d instanceof Object)
System.out.println("d may be cast to Object");
}
}
Output:
a is instance of A b is instance of B c is instance of C c can be cast to A ob now refers to d ob is instance of D ob now refers to c ob cannot be cast to D ob can be cast to A a may be cast to Object b may be cast to Object c may be cast to Object d may be cast to Object Press any key to continue . . .
The instanceof operator isn't needed by most programs, because, generally, you know
the type of object with which you are working. However, it can be very useful when you’re
writing generalized routines that operate on objects of a complex class hierarchy.
Another important example of instanceof operator
In the below example except for the main class, we have also defined three classes and one interface.
We have defined a parent class called Vehicle and two subclasses
called Car and MotorCycle, perspectively. Also,
we have defined an interface called DriveCar, which is implemented only
by class Car. Then we use the operator instanceof in
different cases so as to check the hierarchy among the different types of classes.
Program:
// Demonstrate instanceof operator.
public class InstanceofExample {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
Car car = new Car();
MotorCycle moto = new MotorCycle();
// Those will evaluate to true
System.out.println("vehicle instanceof Vehicle: "
+ (vehicle instanceof Vehicle));
System.out.println("car instanceof Vehicle: "
+ (car instanceof Vehicle));
System.out.println("car instanceof Car: " + (car instanceof Car));
System.out.println("car instanceof DriveCar: "
+ (car instanceof DriveCar));
System.out.println("moto instanceof Vehicle: "
+ (moto instanceof Vehicle));
System.out.println("moto instanceof MotorCycle: "
+ (moto instanceof MotorCycle));
// those will evaluate to false
System.out.println("vehicle instanceof Car: "
+ (vehicle instanceof Car));
System.out.println("vehicle instanceof DriveCar: "
+ (vehicle instanceof DriveCar));
System.out.println("moto instanceof DriveCar: "
+ (moto instanceof DriveCar));
// those will evaluate to false, as the object car is null
car = null;
System.out.println("(car=null) instanceof Vehicle: "
+ (car instanceof Vehicle));
System.out.println("(car=null) instanceof Car: "
+ (car instanceof Car));
}
}
class Vehicle {
}
class Car extends Vehicle implements DriveCar {
}
class MotorCycle extends Vehicle {
}
interface DriveCar {
}
Output:
vehicle instanceof Vehicle: true car instanceof Vehicle: true car instanceof Car: true car instanceof DriveCar: true moto instanceof Vehicle: true moto instanceof MotorCycle: true vehicle instanceof Car: false vehicle instanceof DriveCar: false moto instanceof DriveCar: false (car=null) instanceof Vehicle: false (car=null) instanceof Car: false Press any key to continue . . .
Real world example instanceof in java
Followind is a real use of instanceof keyword by the example given below.
Program:
interface Printable{}
class ClassA implements Printable{
public void a(){
System.out.println("a method");
}
}
class ClassB implements Printable{
public void b(){
System.out.println("b method");
}
}
class Call{
void invoke(Printable p){//upcasting
if(p instanceof ClassA){
ClassA a=(ClassA)p;//Downcasting
a.a();
}
if(p instanceof ClassB){
ClassB b=(ClassB)p;//Downcasting
b.b();
}
}
}//end of Call class
class MainClassInstanceof{
public static void main(String args[]){
Printable p=new ClassB();
Call c=new Call();
c.invoke(p);
}
}
Output:
b method Press any key to continue . . .
- Assignment 1: instanceof operator, checking in current class
- Assignment 2: instanceof operator, checking in child class
- Assignment 3: instanceof operator, checking by assigning null value
- Assignment 4: instanceof operator, Nice example
- Assignment 5: instanceof operator, downcasting with instanceof
- Assignment 6: instanceof operator, without the use of java instanceof
- Assignment 7: instanceof operator, Understanding Real use of instanceof in java