Java Inheritance: The Art of Building Strong and Flexible Code Structures

Kayis Rahman
4 min readMay 1, 2023

--

Java inheritance is a powerful mechanism that allows us to define new classes based on existing classes. Inheritance enables us to reuse existing code and build new classes that are similar to existing ones, but with additional or modified behavior. The existing class is called the parent class or superclass, while the new class is called the child class or subclass.

To define a subclass in Java, we use the extends keyword followed by the name of the parent class. For example, let's say we have a class Animal with some common properties and methods that we want to use in a new class Dog:

public class Animal {
private String name;

public Animal(String name) {
this.name = name;
}

public void speak() {
System.out.println("I am an animal.");
}
}

public class Dog extends Animal {
public Dog(String name) {
super(name);
}

@Override
public void speak() {
System.out.println("Woof! My name is " + super.name + ".");
}
}

Here, the Dog class extends the Animal class using the extends keyword, and we provide a constructor that calls the parent constructor using the super keyword. We also override the speak method from the parent class to make it specific to dogs and use the super keyword to access the name field from the parent class.

Inheritance allows us to define more specialized classes that inherit behaviour from more general ones. For example, we could define a Cat class that also extends Animal:

public class Cat extends Animal {
public Cat(String name) {
super(name);
}

@Override
public void speak() {
System.out.println("Meow! My name is " + super.name + ".");
}
}

Here, the Cat class also extends Animal and provides its own implementation of the speak method.

Inheritance can be used to build complex class hierarchies with multiple levels of subclasses, each with its own specific behavior. This allows us to write more modular and reusable code, and makes it easier to maintain and update our programs over time.

Java inheritance also allows us to use polymorphism, which is the ability of objects of different classes to be used interchangeably. When we define a subclass that overrides a method from its parent class, we can use a reference to the subclass to call the overridden method instead of the parent method. This is because Java determines which method to call at runtime based on the actual type of the object, not the reference type.

For example, consider the following code:

Animal a = new Animal("Generic animal");
Animal d = new Dog("Fido");
Animal c = new Cat("Fluffy");

a.speak(); // "I am an animal."
d.speak(); // "Woof! My name is Fido."
c.speak(); // "Meow! My name is Fluffy."

Here, we create objects of type Animal, Dog, and Cat, and assign them to variables of type Animal. When we call the speak method on each object, Java determines which implementation of the method to call based on the actual type of the object (Animal, Dog, or Cat), not the reference type (Animal). This allows us to write code that works with objects of different classes, as long as they share a common ancestor class.

Inheritance also allows us to define abstract classes and methods, which are classes and methods that have no implementation, but are meant to be subclassed and overridden. Abstract classes and methods provide a way to define a common interface or behavior for a group of related classes, without specifying the details of that behavior.

For example, let’s say we want to define a class Shape that represents a geometric shape, and we want to be able to calculate its area. We could define an abstract method getArea in the Shape class, which must be implemented by any subclass that extends Shape:

public abstract class Shape {
public abstract double getArea();
}

public class Rectangle extends Shape {
private double width;
private double height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

@Override
public double getArea() {
return width * height;
}
}

Here, the Shape class defines an abstract method getArea, which is meant to be overridden by any subclass that extends Shape. The Rectangle class extends Shape and provides its own implementation of the getArea method, which calculates the area of a rectangle based on its width and height.

Java inheritance is a powerful mechanism that allows us to build complex class hierarchies and reuse existing code. By understanding the concepts of inheritance, we can write more modular, flexible, and maintainable code in Java.

--

--