Inheritance in Java
Introduction
Inheritance is a fundamental concept in object-oriented programming (OOP) that allows one class to inherit
the properties and behaviors (fields and methods) of another class. This concept promotes code reusability
and establishes a natural hierarchical relationship between classes.
In Java, inheritance is achieved using the extends
keyword.
Basics of Inheritance
When a class inherits from another class, it is called a subclass (or derived class), and the class from which it inherits is called a superclass (or base class). The subclass inherits all non-private fields and methods from the superclass and can add its own fields and methods or override existing ones.
Example of Inheritance
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // Inherited method
dog.bark(); // Method of Dog class
}
}
In this example, the Dog
class inherits the eat
method from the Animal
class and adds its own bark
method.
Types of Inheritance
Single Inheritance
Java supports single inheritance, where a class can inherit from only one superclass.
1
2
3
4
5
6
7
class A {
// class A code
}
class B extends A {
// class B code
}
Multilevel Inheritance
In multilevel inheritance, a class inherits from a superclass, and another class inherits from that subclass.
1
2
3
4
5
6
7
8
9
10
11
class A {
// class A code
}
class B extends A {
// class B code
}
class C extends B {
// class C code
}
Hierarchical Inheritance
In hierarchical inheritance, multiple classes inherit from a single superclass.
1
2
3
4
5
6
7
8
9
10
11
class A {
// class A code
}
class B extends A {
// class B code
}
class C extends A {
// class C code
}
Hybrid Inheritance
Java does not support hybrid inheritance directly (a combination of multiple and multilevel inheritance) due to the diamond problem. However, this can be achieved using interfaces.
Method Overriding
Method overriding allows a subclass to provide a specific implementation for a method already defined in its superclass. The overridden method in the subclass should have the same name, return type, and parameters as the method in the superclass.
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal {
void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound(); // Output: Bark
}
}
In this example, the Dog
class overrides the makeSound
method of the Animal
class.
The super Keyword
The super
keyword is used to refer to the immediate superclass of the current object.
It can be used to access superclass methods, fields, and constructors.
Accessing Superclass Methods
1
2
3
4
5
6
7
8
9
10
11
12
13
class Animal {
void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
super.makeSound(); // Calls the makeSound method of Animal class
System.out.println("Bark");
}
}
Accessing Superclass Constructors
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Animal {
Animal(String name) {
System.out.println("Animal's name is " + name);
}
}
class Dog extends Animal {
Dog(String name) {
super(name); // Calls the constructor of Animal class
System.out.println("Dog's name is " + name);
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog("Buddy");
}
}
In this example, the Dog
class constructor uses super
to call the constructor of the Animal
class.
The Object Class
In Java, the Object
class is the root of the class hierarchy. Every class in Java directly
or indirectly inherits from the Object
class. It provides several important methods that all Java objects can use,
such as toString()
, equals()
, hashCode()
and clone()
.
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Animal {
// Animal class code
}
class Dog extends Animal {
// Dog class code
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
System.out.println(myDog.toString());
}
}
In this example, the toString()
method from the Object
class is available to the Dog
class.
Best Practices
- Use inheritance only when it is logically appropriate: Ensure that the relationship between the superclass and subclass is logical and makes sense in the context of your application.
- Favor composition over inheritance: Sometimes, using composition (where a class contains instances of other classes) can be more flexible and easier to maintain than using inheritance.
- Avoid deep inheritance hierarchies: Deep hierarchies can make the code harder to understand and maintain. Keep the inheritance structure as simple as possible.
- Use @Override annotation: Always use the @Override annotation when overriding a method to ensure you are correctly overriding a method from the superclass.
Conclusion
Inheritance is a powerful feature in Java that promotes code reusability and a clear hierarchical structure.
By understanding the principles of inheritance, method overriding, and the use of the super
keyword,
you can create more efficient and organized Java applications. However, it’s important to use inheritance judiciously
and consider alternatives such as composition to maintain the flexibility and maintainability of your code.