Understanding Abstraction in Java

Understanding Abstraction in OOP

Hello, fellow coder! Today, we'll decode Java's Abstraction principle, a powerful tool in Object-Oriented Programming. Abstraction is our superhero against seemingly overwhelming complexity, revealing only the necessary details. Are you ready for the fun?

Imagine Abstraction as a superboat, stripping off the complexities and giving you just the essentials to operate effectively. It’s not about understanding all the intricate details; it is about focusing on what truly matters. Consider it this way — to drive a car, you only engage with its external controls while the complex workings beneath remain hidden.

Abstraction in Java

In Java, objects are defined through classes. Every class serves as a preliminary blueprint for an object. It stipulates both the data (attributes) and their potential behaviors (methods). Similar to a car’s control panel, an object's class provides a user-friendly interface, concealing the complex mechanics within.

When utilizing a Java ArrayList, you employ methods like add(), remove(), and sort(). You do so without needing to comprehend how Java manages the list's memory space. The internal workings are abstracted.

Java's Abstract Classes

In Java, classes that possess abstract methods are termed "abstract classes." An abstract class in Java is akin to the pearl inside an oyster, housing at least one abstract method. Each abstract method in an abstract class awaits its implementation in subclasses.

Consider this simple example:

abstract class AbstractClassExample {
    // This method is waiting to be overridden
    abstract void doSomething();
}

public class Main {
    public static void main(String[] args) {
        // AbstractClassExample instance = new AbstractClassExample(); // Will cause a compile-time error
    }
}

As you can see, you cannot instantiate an abstract class, as it's just a skeleton for the future class that will be derived from it. The abstract keyword marks a method as abstract, meaning that's a property/behavior that this class supports, but it has not been implemented yet.

Real-world Example of Abstraction in Java

For instance, when crafting a doodling app that handles shapes, you would define an abstract base class called Shape. It would have area and perimeter as its abstract methods:

abstract class Shape {
    abstract double area();
    abstract double perimeter();
}

To create actual shapes like Rectangle and Circle, you would inherit traits from Shape and define area and perimeter.

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

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

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

    @Override
    double perimeter() {
        return 2 * (width + height);
    }
}

class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double area() {
        return 3.14 * radius * radius;
    }

    @Override
    double perimeter() {
        return 2 * 3.14 * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape rectangle = new Rectangle(2, 3); // A rectangle with sides 2 and 3
        System.out.println("Rectangle area: " + rectangle.area()); // Prints: Rectangle area: 6.0
        System.out.println("Rectangle perimeter: " + rectangle.perimeter()); // Prints: Rectangle perimeter: 10.0

        Shape circle = new Circle(5); // A circle with a radius of 5
        System.out.println("Circle area: " + circle.area()); // Prints: Circle area: 78.5
        System.out.println("Circle perimeter: " + circle.perimeter()); // Prints: Circle perimeter: 31.400000000000002
    }
}

Shape classes provide an abstraction layer, reducing the knowledge you require to calculate the area and perimeter.

Sign up

Join the 1M+ learners on CodeSignal

Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal