In this tutorial, we'll dive into two fundamental concepts in object-oriented programming: inheritance and polymorphism.
Inheritance allows one class to acquire the properties and methods of another class, enabling reusability and a way to add new features to an existing class without altering it.
Polymorphism allows methods to behave differently based on the object that they are acting upon. This allows a single method or operator to behave differently depending on the context.
By the end of this tutorial, you will understand the concept of inheritance and polymorphism, how to implement them in your code, and why they're crucial components of efficient and effective object-oriented programming.
Prerequisites
Inheritance is a mechanism that allows one class to inherit the features (properties and methods) of another class. The class whose properties and methods are inherited is known as the parent or superclass, and the class that inherits these properties and methods is called the child or subclass.
Inheritance allows for code reusability and method overriding (which is a form of polymorphism).
Polymorphism is an OOP principle that allows methods to behave differently, depending on the object/instance they're acting upon. In other words, a single method or operator can perform different actions depending on the context.
Consider a parent class Animal
and a child class Dog
:
// Parent class
class Animal {
void eat() {
System.out.println("eating...");
}
}
// Child class
class Dog extends Animal {
void bark() {
System.out.println("barking...");
}
}
class TestInheritance {
public static void main(String args[]) {
Dog d = new Dog();
d.bark();
d.eat(); // inherited method
}
}
In the above example, the Dog
class extends the Animal
class, hence it inherits the eat()
method. So a Dog
object can call both bark()
and eat()
methods.
Expected output:
barking...
eating...
Consider an Animal
class and Dog
and Cat
classes that inherit from it:
// Parent class
class Animal {
void sound() {
System.out.println("The animal makes a sound");
}
}
// Child classes
class Dog extends Animal {
void sound() {
System.out.println("The dog says: woof woof");
}
}
class Cat extends Animal {
void sound() {
System.out.println("The cat says: meow");
}
}
class TestPolymorphism {
public static void main(String args[]) {
Animal myDog = new Dog(); // Dog object
Animal myCat = new Cat(); // Cat object
myDog.sound();
myCat.sound();
}
}
In the above example, both Dog
and Cat
classes override the sound()
method of the Animal
class. Depending on the object calling the sound()
method, different outputs are produced.
Expected output:
The dog says: woof woof
The cat says: meow
In this tutorial, we've covered the concepts of inheritance and polymorphism. We've learned how inheritance allows one class to acquire the features of another, and how polymorphism enables one method to behave differently based on the object it's acting upon.
To continue learning, consider exploring method overloading and overriding, abstract classes, and interfaces.
Create a Vehicle
class with a drive()
method. Then create Car
and Bike
classes that inherit from Vehicle
and override the drive()
method.
Create a Shape
class with a draw()
method. Then create Circle
, Square
and Triangle
classes that inherit from Shape
and override the draw()
method.
Solutions and tips will vary based on the specifics of the exercise, but be sure to understand the process of creating classes, inheritance, and overriding methods. Practice makes perfect!