image

OOPs Concepts with Examples in Java

Object-Oriented Programming (OOP) is a programming paradigm that focuses on creating objects, which are instances of classes. Java is a popular object-oriented programming language that heavily relies on these OOP concepts. This article will explore the fundamental OOP concepts in Java and provide examples to help you understand them better.

Encapsulation

Encapsulation is wrapping data and methods into a single unit, called a class. It helps hide an object's internal implementation details from the outside world, ensuring data integrity and security. In Java, we achieve encapsulation by private instance variables and providing public methods, known as getters and setters, to access and modify the data.

Example:

public class BankAccount {

    private double balance;

 

    public void deposit(double amount) {

        balance += amount;

    }

 

    public void withdraw(double amount) {

        if (balance >= amount) {

            balance -= amount;

        } else {

            System.out.println("Insufficient funds.");

        }

    }

 

    public double getBalance() {

        return balance;

    }

}

In this example, the BankAccount class encapsulates the balance instance variable and provides methods to deposit, withdraw, and get the current balance.

Inheritance

Inheritance is a mechanism in which a new class is based on an existing class. The new class inherits the properties and methods of the existing class, allowing for code reuse and the creation of hierarchical relationships between classes.

Example:

public class Vehicle {

    private String make;

    private String model;

 

    public Vehicle(String make, String model) {

        this.make = make;

        this.model = model;

    }

 

    public void start() {

        System.out.println("Starting the vehicle.");

    }

 

    // Getters and setters

}

 

public class Car extends Vehicle {

    private int numDoors;

 

    public Car(String make, String model, int numDoors) {

        super(make, model);

        this.numDoors = numDoors;

    }

 

    public void openTrunk() {

        System.out.println("Opening the trunk.");

    }

}

In this example, the Car class inherits the make, model, and start() methods from the Vehicle class, and also adds the numDoors instance variable and the openTrunk() method.

Polymorphism

Polymorphism is the ability of an object to take on multiple forms. In Java, this is achieved through method overriding and method overloading.

Method Overriding:

public class Animal {

    public void makeSound() {

        System.out.println("The animal makes a sound.");

    }

}

 

public class Dog extends Animal {

    @Override

    public void makeSound() {

        System.out.println("The dog barks.");

    }

}

In this example, the Dog class overrides the makeSound() method of the Animal class.

Method Overloading:

public class Calculator {

    public int add(int a, int b) {

        return a + b;

    }

 

    public int add(int a, int b, int c) {

        return a + b + c;

    }

 

    public double add(double a, double b) {

        return a + b;

    }

}

In this example, the Calculator class has three add() methods with different parameters, demonstrating method overloading.

Abstraction

Abstraction is the process of hiding the implementation details and showing only the essential features of an object. In Java, we achieve abstraction through abstract classes and interfaces.

Abstract Class:

public abstract class Shape {

    protected double area;

 

    public abstract void calculateArea();

 

    public void printArea() {

        System.out.println("The area of the shape is: " + area);

    }

}

 

public class Circle extends Shape {

    private double radius;

 

    public Circle(double radius) {

        this.radius = radius;

    }

 

    @Override

    public void calculateArea() {

        area = Math.PI * radius * radius;

    }

}

In this example, the Shape class is an abstract class that defines the calculateArea() method as abstract, forcing the concrete Circle class to implement it.

public interface Movable {

    void move(int x, int y);

}

 

public class Car implements Movable {

    private int x, y;

 

    @Override

    public void move(int x, int y) {

        this.x = x;

        this.y = y;

        System.out.println("The car is moved to (" + x + ", " + y + ").");

    }

}

In this example, the Movable interface defines the move() method, which the Car class must implement.

Composition

Composition is a design principle that allows you to create complex objects by combining simpler ones. It is a "has-a" relationship, where one object contains another object as a field.

Example:

public class Engine {

    private int horsepower;

 

    public Engine(int horsepower) {

        this.horsepower = horsepower;

    }

 

    public void start() {

        System.out.println("The engine is started.");

    }

}

 

public class Car {

    private String make;

    private String model;

    private Engine engine;

 

    public Car(String make, String model, int horsepower) {

        this.make = make;

        this.model = model;

        this.engine = new Engine(horsepower);

    }

 

    public void start() {

        engine.start();

        System.out.println("The car is started.");

    }

}

In this example, the Car class has a Engine object as a field, demonstrating composition.

FAQs

1. What is the difference between inheritance and composition?

Inheritance is an "is-a" relationship, where a subclass inherits properties and methods from a superclass. Composition, on the other hand, is a "has-a" relationship, where an object contains another object as a field. Inheritance allows for code reuse through hierarchical relationships, while composition allows for the creation of complex objects by combining simpler ones.

2. Why is encapsulation important in Java?

Encapsulation is important in Java because it:

  1. Hides the internal implementation details of an object, making the code more maintainable and less prone to errors.
  2. Ensures data integrity by controlling access to the object's instance variables.
  3. Provides a well-defined interface for interacting with the object, making the code more modular and flexible.
  4. Allows for information hiding, which improves the overall security of the application.

3. Can a class in Java implement multiple interfaces?

Yes, a class in Java can implement multiple interfaces. This is known as multiple inheritance of types, and it allows a class to inherit the methods and constants from multiple interfaces. However, a class can only extend one superclass, as Java does not support multiple inheritance of implementation.

4. What is the purpose of abstract classes and interfaces in Java?

Abstract classes and interfaces serve different purposes in Java:

Abstract classes:

  • Provide a common base for related classes.
  • Can contain both abstract and non-abstract (concrete) methods.
  • Can have instance variables and constructors.
  • Promote code reuse and facilitate the creation of hierarchical relationships.

Interfaces:

  • Define a contract or a set of methods that a class must implement.
  • Can contain only abstract methods, default methods, and static methods.
  • Promote abstraction and enable the creation of loosely coupled, modular designs.
  • Allow for multiple inheritance of types, as a class can implement multiple interfaces.

5. How does polymorphism work in Java?

Polymorphism in Java works through method overriding and method overloading:

Method Overriding:

  • Allows a subclass to provide its own implementation of a method that is already defined in the superclass.
  • The method in the subclass must have the same name, return type, and parameter list as the method in the superclass.

Method Overloading:

  • Allows a class to have multiple methods with the same name but different parameter lists.
  • The Java compiler determines which method to call based on the number and types of the arguments passed at the time of the method call.
Share On