Java Glossary : instanceof

CMP home Java glossary home Menu no menu Last updated 2004-06-28 by Roedy Green ©1996-2004 Canadian Mind Products

Java definitions: 0-9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

You are here : home : Java Glossary : I words : instanceof.

instanceof
instanceof is a curious beast. It is an operator, not a function. It has more powers than many give it credit for, and it lacks some you might expect of it. I summarise with this table:
Code Effect
dog instanceof Dog true
dalmatian instanceof Dog true
dog instanceof Dalmatian false
dalmatian instanceof ShowDogInterface true
dalmatian instanceof dog syntax error
! dalmatian instanceof Dog syntax error
! (dalmatian instanceof Dog) false
dog instanceOf Dalmatian syntax error
dalmatian instanceof "Dog" syntax error
dalmatian instanceof Class .forName("DogPackage.Dog" ) syntax error
null instanceof String false

Because of laziness on the part of compiler writers, instanceof cannot deal with a class determined dynamically using Class.forName. For that, you must say something like:

if ( Class.forName ( classNameString ).isInstance ( myObject ) ) ...

Just to keep you on your toes, there are yet other methods with similar names, java.beans.Beans.isInstanceOf and java.beans.Beans.getInstanceOf.

Implementation

If you are like me, you are curious about what goes on inside the JVM. How does it implement instanceof? instanceof logic gets used quite frequently, every time you explicitly use instanceof, every time you cast, every time you store a object into an array. How could instanceof be implemented to make this operation quick?

It turns out that everything depends on the type of the desired instance and the actual type of the object. The type of the object's reference is irrelevant, though obviously it could be used to optimise away silly instanceofs such as Dog instanceof Dog.

One technique is to assign class numbers by walking the inheritance tree of Object depth first. Then all descendants of a given object fall in a range m to n, and no other classes fall in that range. The problem comes when a new class is loaded, especially via Class.forName which would upset the numbering scheme. Perhaps it could leave holes for new classes to fit in. Only rarely would a complete renumbering be needed.

Another brute force technique is to compare the test object's class with the desired class. If that fails, compare the superclass, etc, right on back to Object.

Here is yet another technique: I want to know if a given Dog reference is a Dalmatian. We know that class nesting depth works like this:

depth class name
3 MostlyBlackDalmatian
2 Dalmatian
1 Dog
0 Object
So all you have to test is that the class of your reference has at least depth 2 and at depth 2 in its class hierarchy is Dalmatian. This works even if new classes are added. This means your object needs a pointer to description of the class hierarchy. The classes could be assigned numbers (in load order) in addition to names, for comparing speed.

For interfaces, it is more complex since classes can implement multiple interfaces. Interfaces can inherit from other interfaces, and classes inherit the interfaces implemented by their ancestors. This is one reason why you attempt to use class references rather than inferface references in time critical code. There you need a bit map indexed by interface number for each class to say whether it implements the interface.


CMP logo
CMP_home
home
Canadian Mind Products CSS
HTML Checked!
ICRA ratings logo
mindprod.com IP:[24.87.56.253]
Your IP:[80.134.30.163]
You are visitor number 13708.
Please send errors, omissions and suggestions
to improve this page to Roedy Green.
You can get a fresh copy of this page from: or possibly from your local J: drive mirror:
http://mindprod.com/jgloss/instanceof.html J:\mindprod\jgloss\instanceof.html