What are Upcasting and Downcasting in Java?
In Java, we have two ways of object typecasting: Upcasting and Downcasting.
- Upcasting – Java permits an object of a subclass type to be treated as an object of any superclass type. We can access a method or field from the parent class via a child object.
Upcasting is done automatically. - Downcasting – When we want a Parent class reference to access a method or field declared in a child class, we must explicitly cast the parent object to the child object.
Upcasting
When performing upcasting, we assign an object of a sub-class to a reference of superclass type.
Using this reference, we can access objects and fields within a subclass, but only those inherited from the superclass.
Example:
class Vehicle {
int maxSpeed = 250;
public void printMaxSpeed() {
System.out.println("Max speed: " + maxSpeed);
}
}
class Car extends Vehicle {
int maxSpeed = 300;
@Override
public void printMaxSpeed() {
System.out.println("Max speed: " + maxSpeed);
}
}
class Test {
public static void main(String[] args) {
Vehicle vehicle = new Car(); // upcasting - casting child class to parent class
vehicle.printMaxSpeed();
}
}
In the above example, we inherit and override the printMaxSpeed method in the Car class, and then in the main method, we assign a Car object to a reference of Vehicle type.
Using the vehicle variable we called the method from the subclass (Car), which is declared in the parent class (Vehicle).
Downcasting
When we want to call a method declared in a sub-class via a reference of the superclass type, we have to perform explicit casting or downcasting.
Example:
class Vehicle {
int maxSpeed = 250;
public void printMaxSpeed() {
System.out.println("Max speed: " + maxSpeed);
}
}
class Car extends Vehicle {
int maxSpeed = 300;
String colour = "Blue";
@Override
public void printMaxSpeed() {
System.out.println("Max speed: " + maxSpeed);
}
public void printColour() { // This method is declared in a sub-class and it's not visible from the superclass.
System.out.println("Colour: " + colour);
}
}
class Test {
public static void main(String[] args) {
Vehicle vehicle = new Car();
((Car) vehicle).printColour(); // downcasting - calling method declared in the subclass using reference of superclass type
}
}
In the example above, you can see how we had to explicitly cast a call to a method from the Car class using a variable of type Vehicle.
We had to perform downcasting because we could not reference the method printColour using a variable vehicle. After all, it is invisible to the superclass.
That was all about Upcasting and Downcasting in Java!