DEV Community

Mukesh
Mukesh

Posted on

Abstraction in Java Explained: Abstract Classes vs Interfaces

Understanding Abstraction in Java

In the world of object-oriented programming, abstraction plays a vital role in simplifying complex systems. It allows developers to focus on what an object does rather than how it does it.

What is Abstraction?

Abstraction is the process of hiding internal implementation details and exposing only the essential functionality of an object. It helps reduce programming complexity and effort by providing a cleaner and more focused interface.

In simple terms:
Abstraction lets you focus on the "what" instead of the "how".

For example, when you drive a car, you interact with the steering wheel, pedals, and dashboard. You don’t need to know how the engine works internally—that’s abstraction.

Achieving Abstraction in Java

Java provides two primary ways to achieve abstraction:

1. Abstract Class (0% to 100% Abstraction)

An abstract class in Java is a class that cannot be instantiated and may contain abstract methods (without a body) as well as concrete methods (with a body).

Key Points:
  • Declared using the abstract keyword.
  • Can have both abstract and non-abstract methods.
  • Can include constructors, static, and final methods.
  • Meant to be extended by subclasses which implement abstract methods.
abstract class Vehicle {
    abstract void start(); // abstract method
    void stop() {
        System.out.println("Vehicle stopped.");
    }
}
Enter fullscreen mode Exit fullscreen mode
Abstract Method:

A method without implementation, declared using the abstract keyword.

abstract void printStatus(); // no body
Enter fullscreen mode Exit fullscreen mode

If a class contains even one abstract method, class must be declared as abstract, or it will result in a compile-time error.

2. Interface (100% Abstraction)

An interface in Java is like contract or blueprint. It defines what should be done, but not how.

Key Points:
  • Contains only abstract methods and static constants (before Java 8).
  • Cannot have method bodies (until Java 8).
  • Supports multiple inheritance.
  • Promotes loose coupling between components.
  • Interfaces represent the "IS-A" relationship.
interface Drawable {
    void draw(); // abstract method
}
Enter fullscreen mode Exit fullscreen mode
Enhancements Since Java 8 and 9:
  • Java 8: Interfaces can have default and static methods.
  • Java 9: Interfaces can also have private methods.
interface Shape {
    default void log() {
        System.out.println("Logging Shape");
    }
    static void show() {
        System.out.println("Static method in Interface");
    }
}
Enter fullscreen mode Exit fullscreen mode

When to Use What?

  • Use abstract classes when:

    • You want to provide common functionality to all subclasses.
    • You want to define non-static or non-final fields.
  • Use interfaces when:

    • You need to implement multiple inheritances.
    • You want to define a contract that multiple unrelated classes can implement.

Conclusion

Abstraction is one of the four pillars of object-oriented programming. Whether you choose abstract classes or interfaces depends on your design needs, but both serve the same fundamental purpose: to hide complexity and expose simplicity.

Top comments (0)