Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Upcasting and Downcasting in Java
π Scenario: Imagine you are creating a simple program to manage different types of animals in a zoo. Each animal can make a sound, but some animals have special sounds. You will learn how to use upcasting and downcasting to work with these animals.
π― Goal: Build a Java program that demonstrates upcasting and downcasting with a base class Animal and a subclass Dog. You will create objects, cast them, and call their methods to see how casting works.
π What You'll Learn
Create a base class called Animal with a method makeSound() that prints "Some sound".
Create a subclass called Dog that extends Animal and overrides makeSound() to print "Bark".
Create an Animal reference that points to a Dog object (upcasting).
Downcast the Animal reference back to a Dog reference and call a bark() method unique to Dog.
Print outputs to show the effects of upcasting and downcasting.
π‘ Why This Matters
π Real World
Upcasting and downcasting are used in real-world programs to write flexible code that can work with general types but still access specific features when needed.
πΌ Career
Understanding casting is important for Java developers working with inheritance, polymorphism, and designing clean, reusable code.
Progress0 / 4 steps
1
Create the base class Animal and subclass Dog
Create a class called Animal with a method makeSound() that prints "Some sound". Then create a subclass called Dog that extends Animal and overrides makeSound() to print "Bark".
Java
Hint
Use class keyword to create classes. Use extends to make Dog a subclass of Animal. Override makeSound() in Dog.
2
Add a unique method bark() to Dog
Inside the Dog class, add a method called bark() that prints "Dog is barking".
Java
Hint
Define a new method bark() inside Dog that prints the message.
3
Create an Animal reference pointing to a Dog object (upcasting)
Create a variable called animal of type Animal and assign it a new Dog() object (this is upcasting). Then call animal.makeSound().
Java
Hint
Use Animal animal = new Dog(); to upcast. Then call animal.makeSound();.
4
Downcast the Animal reference to Dog and call bark()
Downcast the animal variable to a Dog type and store it in a variable called dog. Then call dog.bark() to print "Dog is barking".
Java
Hint
Use Dog dog = (Dog) animal; to downcast. Then call dog.bark();.
Practice
(1/5)
1. What is upcasting in Java? Upcasting means:
easy
A. Changing the value of a variable
B. Treating a specific object as a more general type
C. Creating a new object from a class
D. Converting a general type to a specific type
Solution
Step 1: Understand object type hierarchy
In Java, classes can inherit from other classes, making some types more general (superclass) and others more specific (subclass).
Step 2: Define upcasting
Upcasting means treating a subclass object as if it were an instance of its superclass, which is more general.
Final Answer:
Treating a specific object as a more general type -> Option B
Quick Check:
Upcasting = Treat specific as general [OK]
Hint: Upcasting = subclass object as superclass type [OK]
Common Mistakes:
Confusing upcasting with downcasting
Thinking upcasting creates a new object
Believing upcasting changes the actual object type
2. Which of the following is the correct syntax for downcasting in Java?
Animal a = new Dog();
// Downcast here
easy
A. Dog d = (Dog) a;
B. Dog d = a;
C. Dog d = a.toDog();
D. Dog d = (Animal) a;
Solution
Step 1: Understand downcasting syntax
Downcasting requires an explicit cast to convert a superclass reference back to a subclass type.
Step 2: Apply correct cast
The correct syntax is: SubclassType var = (SubclassType) superClassVar; so here: Dog d = (Dog) a;
Final Answer:
Dog d = (Dog) a; -> Option A
Quick Check:
Downcasting needs explicit cast [OK]
Hint: Downcast with (Subclass) before variable [OK]
Common Mistakes:
Omitting the cast operator
Casting to wrong type
Using methods like toDog() which don't exist
3. What will be the output of this code?
class Animal { void sound() { System.out.println("Animal sound"); } }
class Dog extends Animal { void sound() { System.out.println("Bark"); } void fetch() { System.out.println("Fetching"); } }
public class Test {
public static void main(String[] args) {
Animal a = new Dog(); // upcasting
a.sound();
// a.fetch(); // line A
((Dog) a).fetch(); // line B
}
}
medium
A. Bark\nFetching
B. Bark\nAnimal sound
C. Animal sound\nFetching
D. Compilation error at line A
Solution
Step 1: Understand method overriding and upcasting
Variable a is of type Animal but refers to a Dog object. Calling a.sound() calls Dog's overridden method, printing "Bark".
Step 2: Analyze method call fetch()
Method fetch() is not in Animal, so a.fetch() is invalid (commented out). Downcasting (Dog) a allows calling fetch(), printing "Fetching".
Hint: Upcast calls overridden; downcast needed for subclass-only methods [OK]
Common Mistakes:
Thinking a.sound() calls Animal's method
Trying to call fetch() without downcasting
Confusing compile vs runtime errors
4. Identify the error and fix it in this code:
class Animal {}
class Cat extends Animal { void meow() { System.out.println("Meow"); } }
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
Cat c = (Cat) a; // line X
c.meow();
}
}
medium
A. No error, code runs fine
B. Syntax error; fix by removing cast
C. ClassCastException at runtime; fix by checking instanceof before casting
D. Change Animal to Cat in line X
Solution
Step 1: Identify the casting problem
Variable a refers to an Animal object, not a Cat. Casting Animal to Cat without checking causes ClassCastException at runtime.
Step 2: Fix with instanceof check
Before casting, check if (a instanceof Cat) to ensure safe downcasting and avoid runtime error.
Final Answer:
ClassCastException at runtime; fix by checking instanceof before casting -> Option C
Quick Check:
Downcast only if instanceof true [OK]
Hint: Use instanceof before downcasting to avoid errors [OK]
Common Mistakes:
Ignoring runtime ClassCastException
Assuming cast always works
Trying to fix with syntax changes only
5. Given these classes:
class Vehicle { void start() { System.out.println("Vehicle started"); } }
class Car extends Vehicle { void start() { System.out.println("Car started"); } void openTrunk() { System.out.println("Trunk opened"); } }
class Bike extends Vehicle { void start() { System.out.println("Bike started"); } void kickStart() { System.out.println("Kickstarted"); } }
Which code snippet correctly upcasts and downcasts to call openTrunk() safely?
hard
A.
Vehicle v = new Vehicle();
if (v instanceof Car) {
((Car) v).openTrunk();
}
B.
Vehicle v = new Bike();
((Car) v).openTrunk();
C.
Car c = new Vehicle();
c.openTrunk();
D.
Vehicle v = new Car();
if (v instanceof Car) {
((Car) v).openTrunk();
}
Solution
Step 1: Understand upcasting and downcasting here
Variable v is declared as Vehicle but assigned a Car object (upcasting). To call Car-specific method openTrunk(), downcast is needed.
Step 2: Check safe downcasting
Using instanceof ensures v is actually a Car before downcasting and calling openTrunk(). This avoids runtime errors.
Final Answer:
Vehicle v = new Car(); if (v instanceof Car) { ((Car) v).openTrunk(); } -> Option D
Quick Check:
Upcast then instanceof check before downcast [OK]
Hint: Always check instanceof before downcasting [OK]
Common Mistakes:
Downcasting without instanceof check
Assigning superclass object to subclass variable
Calling subclass methods on superclass references without cast