Object-Oriented Programming (OOP)

Object-Oriented Programming (OOP) is a well-established programming paradigm that allows developers to model complex systems by organizing code into reusable, maintainable components. OOP is based on four key principles: Abstraction, Encapsulation, Inheritance, and Polymorphism. Each of these concepts is designed to handle real-world challenges, making software development more efficient and scalable.

Comparison Table of OOP Concepts

ConceptDescriptionExample
AbstractionDefines essential features of objects while hiding internal implementation.Using abstract classes or interfaces to define behaviors.
EncapsulationEncapsulates data and methods, controlling access and protecting data integrity.Private variables managed by getters/setters.
InheritanceEstablishes a hierarchical relationship between classes, enabling code reuse and extension.A Car class inherits from a Vehicle class.
PolymorphismAllows methods to perform differently based on the object that invokes them.Overriding and overloading methods for varied behavior.

1. Abstraction Abstraction focuses on defining what objects should do rather than how they achieve it. This enables the separation of high-level logic from complex internal details, making code cleaner and easier to manage. It is achieved using abstract classes and interfaces.

Example:

// Abstracting Vehicle behavior
abstract class Vehicle {
abstract void move(); // Define the method, but leave the implementation to subclasses
}
class Car extends Vehicle {
@Override
void move() {
System.out.println(“The car drives on the road.”);
}
}

2. Encapsulation Encapsulation protects an object’s internal state by restricting access to its data. It ensures that the object controls how its data is modified, promoting data integrity. Encapsulation is implemented using access modifiers (private, protected, public) and methods like getters and setters.

Example:

class BankAccount {
private double balance; // Private, encapsulated data
// Get balance – controlled access
public double getBalance() {
return balance;
}// Add funds – control logic

public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
}

3. Inheritance Inheritance is a mechanism for creating a new class from an existing one, allowing the new class (child) to reuse, extend, or modify the behavior of the parent class. This promotes code reuse and establishes a logical relationship between classes. Understanding inheritance hierarchies is crucial for building scalable systems.

Example:

class Vehicle {
void start() {
System.out.println("Vehicle starts.");
}
}
class ElectricCar extends Vehicle {
// Inherits ‘start’ method; can extend or override it
@Override
void start() {
System.out.println(“Electric car starts silently.”);
}
}

Types of Inheritance:

  • Single: A class inherits from one parent class.
  • Multilevel: A class is derived from a class that is also derived from another class.
  • Hierarchical: Multiple classes inherit from a single parent class.
  • Multiple (achieved via interfaces in Java): A class can implement multiple interfaces.
  • Hybrid: Combines two or more inheritance types to form a complex hierarchy.

Overriding: Overriding allows a child class to provide a specific implementation for a method already defined in its parent class. The method must maintain the same signature but can change its behavior.

4. Polymorphism Polymorphism enables objects to be treated as instances of their parent class, even if they behave differently. There are two types:

  • Compile-Time Polymorphism (Method Overloading): Multiple methods in the same class with the same name but different parameters.
  • Runtime Polymorphism (Method Overriding): Methods in child classes modify the behavior of methods from the parent class.

Example:

class Animal {
void makeSound() {
System.out.println("Animal makes a sound.");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println(“Dog barks.”);
}
}class Cat extends Animal {
@Override
void makeSound() {
System.out.println(“Cat meows.”);
}
}Advanced Concepts:

  • Interfaces: Define contracts for classes. They provide the flexibility to implement multiple behaviors across various classes. Interfaces facilitate polymorphism and enhance the modular design of systems.
  • Abstract Classes vs. Interfaces: Abstract classes can have both concrete and abstract methods, while interfaces only define method signatures. Choose abstract classes when there is a strong relationship, and interfaces for loose coupling.
  • Constructors: Ensure proper initialization of objects. Constructors can be overloaded, allowing for varied ways to set up an object.
  • Overloading: Method overloading is a form of compile-time polymorphism, enabling developers to define multiple methods with the same name but different parameters, enhancing flexibility.
Scroll to Top