Upcasting and Downcasting in Java
Upcasting and downcasting are important part of Java, which allow us to build complicated programs using simple syntax, and gives us great advantages, like Polymorphism or grouping different objects. Java permits an object of a subclass type to be treated as an object of any superclass type. This is called upcasting. Upcasting is done automatically, while downcasting must be manually done by the programmer, and i’m going to give my best to explain why is that so.
Upcasting and downcasting are NOT like casting primitives from one to other, and I believe that’s what causes a lot of confusion, when programmer starts to learn casting objects.
Polymorphism: All methods in java are virtual by default. That means that any method can be overridden when used in inheritance, unless that method is declared as final or static.
You can see the example below how getType(); works according to the object(Dog,Pet,Police Dog) type.
Assume you have three dogs
Dog – This is the super Class.
Pet Dog – Pet Dog extends Dog.
Police Dog – Police Dog extends Pet Dog.
/**
* Pet Dog has an extra method dogName()
*/
/**
* Police Dog has an extra method secretId()
*/
Polymorphism : All methods in java are virtual by default. That means that any method can be overridden when used in inheritance, unless that method is declared as final or static.(Explanation Belongs to Virtual Tables Concept)
Virtual Table / Dispatch Table : An object’s dispatch table will contain the addresses of the object’s dynamically bound methods. Method calls are performed by fetching the method’s address from the object’s dispatch table. The dispatch table is the same for all objects belonging to the same class, and is therefore typically shared between them.
Downcasting need to be done by the programmer manually.
When you try to invoke the secretID(); method on obj3 which is PoliceDog object but referenced to Dog which is a super class in the hierarchy it throws error since obj3 don’t have access to secretId() method. In order to invoke that method you need to Downcast that obj3 manually to PoliceDog.
In the similar way to invoke the dogName();method in PetDog class you need to downcast obj2 to PetDog since obj2 is referenced to Dog and don’t have access to dogName(); method
Why is that so, that upcasting is automatically applied, but downcasting must be manual?
Well, you see, upcasting can never fail. But if you have a group of different Dogs and want to downcast them all to a to their types, then there’s a chance, that some of these Dogs are actually of different types i.e., PetDog, PoliceDog, and process fails, by throwing ClassCastException.
This is the reason you need to downcast your objects manually if you have referenced your objects to the super class type.
Note: Here by referencing means you are not changing the memory address of your objects when you downcast it it still remains same you are just grouping them to particular type in this case Dog.