What is Encapsulation in OOPS? Types, Examples, Implementation, & More
Updated on Mar 28, 2025 | 17 min read | 37.2k views
Share:
For working professionals
For fresh graduates
More
Updated on Mar 28, 2025 | 17 min read | 37.2k views
Share:
Table of Contents
Do you know what encapsulation in OOPS is? If no, don’t worry, you are at the right place! Encapsulation in OOPS (Object-Oriented Programming) is a vital concept that protects your data and keeps your classes neat. By bundling related properties and functions into a single unit, you decide exactly how outsiders interact with that unit, preventing unwanted meddling and keeping your code simpler to maintain.
Whether you are building small projects or tackling more complex tasks, this approach helps you avoid messy code and unexpected bugs.
In this blog, you'll explore the core ideas behind encapsulation in OOPS and discover how C++, Java, and Python handle it. You'll learn about different types of encapsulation, understand its advantages and disadvantages, and pick up insights on data security and code organization.
Encapsulation in Object-Oriented Programming combines data (attributes) and methods (functions) under one class. This allows you to control exactly how those methods interact with each other and how much of that interaction is visible to outside code.
Keeping certain parts private prevents unauthorized or accidental changes and maintains a clean boundary around your data.
Let’s understand it better with an example – consider a simple ‘StudentRecord’ class that manages a student’s name, marks, and roll number. In many programming languages, you control access to class members through access specifiers listed below:
In simple terms, encapsulation in OOPS means wrapping data and methods into a single unit — a class — and restricting direct access to some components. Now that you understand encapsulation meaning in programming, you’ll see how it can take different forms in OOPS in the next section.
When discussing Encapsulation in OOPS, different strategies can help securely organize data and functions.
Here are the common approaches you might find:
Yes, encapsulation in OOPS does group data and methods – but it’s more than that. It also brings a set of rules that govern how information is protected and concealed. By applying these rules, you can keep sensitive parts of your code safe while still allowing valid interactions through designated access points.
Here are two core properties that make this process effective:
1. Data Protection
Data Protection focuses on guarding sensitive variables behind class boundaries. For example, you might place details like passwords or bank balances in a private section of the class and then offer only controlled functions for reading or updating those details.
This approach reduces the risk of mistakes and unauthorized changes since you control how outside code interacts with the data.
Let’s understand this with the help of an example code.
In the following Java example, a BankAccount class uses private fields for balance and allows only controlled operations on that balance.
public class BankAccount {
private double balance;
public BankAccount(double initialBalance) {
if (initialBalance >= 0) {
balance = initialBalance;
} else {
balance = 0;
}
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public void withdraw(double amount) {
if (amount <= balance && amount > 0) {
balance -= amount;
}
}
public double getBalance() {
return balance;
}
}
Output:
120.0
Why it helps: Direct access to balance is blocked. You control deposits and withdrawals through the class’s own methods, which means no external code can set an invalid balance.
2. Information Hiding
Information Hiding goes one step further by concealing not just the data but also any internal implementation. You only reveal the methods or interfaces that someone needs to accomplish tasks with your class.
This separation lets you modify or improve the internal code later without affecting anything that relies on those public interfaces. It also keeps your overall design simpler for anyone using the class.
Let’s understand this with the help of an example code.
In this C++ example, a Student class includes hidden logic for validating age and makes that logic available only through public methods.
#include <iostream>
using namespace std;
class Student {
private:
string name;
int age;
// Internal logic for validating data
bool isValidAge(int a) {
return (a > 0 && a < 150);
}
public:
// Public interface
void setDetails(string n, int a) {
name = n;
if (isValidAge(a)) {
age = a;
} else {
age = 0;
}
}
void display() {
cout << "Name: " << name << "\nAge: " << age << endl;
}
};
int main() {
Student s;
s.setDetails("Rahul", 25);
s.display();
return 0;
}
Output:
Name: Rahul
Age: 25
Why it helps: By exposing only setDetails and display, you can change how age is validated or stored later without breaking any external code.
As you know, encapsulation ensures that data stays hidden unless a user is allowed to see it. You define how data is accessed and manipulated through a clear set of rules, which keeps your classes organized.
Once you lock in these rules, you protect internal details while letting other parts of your program interact with the data through specific methods.
Here’s a clear step-by-step guidance on how encapsulation in OOPS works:
Now, let’s understand the working of encapsulation in OOPS with an example.
Below is a Java example that follows these steps and shows how encapsulation looks in practice:
Rahul’s marks default to 0 in this snippet since 120 didn’t fit the allowed range. That’s the power of encapsulation: you’re free to enforce strict rules and keep your data in a healthy state.
// File: Student.java
public class Student {
private String name;
private int marks;
public Student(String n, int m) {
name = n;
setMarks(m); // Uses setter for validation
}
public void setMarks(int m) {
if (m >= 0 && m <= 100) {
marks = m;
} else {
marks = 0; // default if invalid
}
}
public int getMarks() {
return marks;
}
public String getName() {
return name;
}
}
// File: Demo.java
public class Demo {
public static void main(String[] args) {
Student s1 = new Student("Aditi", 85);
System.out.println(s1.getName() + " => " + s1.getMarks());
Student s2 = new Student("Rahul", 120); // Invalid
System.out.println(s2.getName() + " => " + s2.getMarks());
}
}
Output:
Aditi => 85
Rahul => 0
In the coming sections, you’ll learn how to implement encapsulation in C++, Java, and Python. But before you can do that, you must understand that access modifiers differ in all these languages. Explore how!
Here’s a quick snapshot table citing the differences. Check it out to easily understand how encapsulation is implemented in these programming languages. .
Language |
Private / Protected |
Public |
C++ Modifiers | private, protected | public |
Java Modifiers | private, protected | public |
Python Modifiers | No strict enforcement, but prefix with __var for private convention | Regular function or variable name is considered public |
That said, let’s dive into their implementation through examples.
Encapsulation in C++ controls which parts of your code can access or modify data, keeping everything organized and safe. You often rely on private or protected members for sensitive details, then add public methods to handle valid interactions. This avoids unwanted changes and keeps your classes easy to maintain.
Here are some steps you can follow:
Example: Encapsulating a Student’s Details
Here, encapsulation prevents random external code from assigning negative or impossible values to marks. Thus, you maintain full control over valid data and guard against accidental errors.
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
string name;
int marks;
bool isValidMarks(int m) {
return (m >= 0 && m <= 100);
}
public:
void setName(string n) {
name = n;
}
void setMarks(int m) {
if (isValidMarks(m)) {
marks = m;
} else {
marks = 0; // default if invalid
}
}
string getName() {
return name;
}
int getMarks() {
return marks;
}
};
int main() {
Student s1, s2;
s1.setName("Ravi");
s1.setMarks(88);
s2.setName("Priya");
s2.setMarks(120); // invalid, gets set to 0
cout << s1.getName() << " => " << s1.getMarks() << endl;
cout << s2.getName() << " => " << s2.getMarks() << endl;
return 0;
}
Output:
Ravi => 88
Priya => 0
You can also study OOPS concepts in C++ to further expand your understanding of making software applications secure.
Encapsulation in Java revolves around declaring your key data as private and then using public methods for controlled access. This way, you can insert checks, logs, or any additional logic without letting external code meddle with the underlying details. It’s a clean way to guard information while keeping classes flexible for future changes.
Here are some steps you can follow:
Example: Encapsulating an Employee’s Details
In this code, you control every update to an employee’s salary while keeping the logic simple and centralized. If you ever decide to adjust the calculation or add error messages, the rest of your program remains unchanged.
// File: Employee.java
public class Employee {
private String name;
private double salary;
public Employee(String n, double initialSalary) {
name = n;
setSalary(initialSalary); // Uses the setter for validation
}
public void setSalary(double amount) {
if (amount >= 0) {
salary = amount;
} else {
salary = 0;
}
}
public double getSalary() {
return salary;
}
public String getName() {
return name;
}
}
// File: Demo.java
public class Demo {
public static void main(String[] args) {
Employee emp1 = new Employee("Reema", 45000);
System.out.println(emp1.getName() + " => " + emp1.getSalary());
Employee emp2 = new Employee("Nikhil", -100);
System.out.println(emp2.getName() + " => " + emp2.getSalary());
}
}
Output:
Reema => 45000.0
Nikhil => 0.0
Need further clarification? Check out the OOPS Concept in Java Explained for Beginners to better grasp the subject.
Encapsulation in Python takes a less strict approach compared to languages like C++ or Java, but you can still structure your code so that only approved methods touch important data.
Typically, you rely on naming conventions — especially prefixing an attribute with double underscores — to signal that it’s meant for internal use. You then supply property getters or regular methods to handle valid changes.
Here are a few steps to keep in mind:
Example: Encapsulating Details in a Python Class
In this code, while Python won’t block you from accessing __salary if you try hard enough, this pattern signals the right way to interact with employee data and keeps your code neatly organized.
class Employee:
def __init__(self, name, salary):
self.name = name
self.__salary = 0
self.set_salary(salary)
def set_salary(self, amount):
if amount > 0:
self.__salary = amount
else:
self.__salary = 0
def get_salary(self):
return self.__salary
# Example usage:
if __name__ == "__main__":
emp = Employee("Raj", 30000)
print(emp.name, "=>", emp.get_salary())
emp.set_salary(-500) # Invalid, defaults to 0
print(emp.name, "=>", emp.get_salary())
Output:
Raj => 30000
Raj => 0
Also Read: A Complete Guide on OOPs Concepts in Python
Encapsulation brings clear boundaries to how data is accessed, which can help you reduce errors and keep your code more organized. However, it also comes with certain trade-offs you need to consider before deciding how strictly to lock down each part of your system.
Let’s explore both!
Here’s a tabulated snapshot of the benefits of encapsulation in OOPS.
Advantage |
Explanation |
Data Protection | Restricts direct access so only approved methods can modify sensitive details. |
Improved Maintenance | Contains changes within a class, letting you adjust internals without disturbing other parts. |
Simplified Debugging | Makes it easier to pinpoint issues, since each class manages its own data and logic. |
Reusability | Encapsulated modules can be reused in multiple projects with minimal refactoring. |
Here’s a summary of the pitfalls of encapsulation you must know.
Disadvantage |
Explanation |
Added Complexity | Excessive private members and many getters/setters can create confusion. |
Possible Performance Hit | Layers of method calls can slow things down in performance-critical scenarios. |
Limited Direct Access | Forces you to go through methods instead of directly reading or updating data, which can be inconvenient at times. |
Requires Early Planning | Poor initial design can make future updates harder if you lock down classes too strictly. |
Encapsulation isn’t just a programming principle. You can spot it in everyday situations where the inside workings of a system are hidden, and only a limited set of actions is offered to the outside world. Seeing these parallels can help you grasp how encapsulation in OOPS secures data and keeps processes efficient.
Below are a few examples that highlight the concept.
1. Sales Department Analogy
In a company's sales department, data like customer records, sales figures, and contracts are handled by a team, but not everyone has access to it.
Encapsulation Example:
2. ATM Machine
An ATM is a great analogy for encapsulation, as it hides the complexities of its internal processes while exposing limited, user-friendly functionality.
Encapsulation Example:
3. Car Engine System
A car's engine is encapsulated within the vehicle, with only specific controls exposed to the driver.
Encapsulation Example:
Object-Oriented Programming (OOP) is built upon four fundamental principles, often referred to as pillars, that guide software design and promote code reusability, maintainability, and scalability.
These pillars are Abstraction, Encapsulation, Inheritance, and Polymorphism. Each plays a vital role in creating robust and well-structured applications.
Let's dive into how encapsulation compares with the other three pillars.
1. Encapsulation vs Abstraction
Abstraction simplifies complex systems by modeling classes appropriate to the problem and working at a suitable level of complexity. It involves hiding the complex implementation details and exposing only the essential information about an object. This allows developers to focus on what an object does rather than how it achieves it.
Here’s how it differs from encapsulation:
Aspect |
Encapsulation |
Abstraction |
Primary Goal | Data hiding and protection, ensuring data integrity | Hiding complexity and presenting a simplified view to the user |
Implementation | Achieved by declaring class members as private and providing public methods (getters and setters) to access and modify them | Achieved through abstract classes and interfaces, focusing on what an object does rather than how it does it |
Focus | Internal implementation details and data security | External behavior and user interaction |
Analogy | A capsule that protects medicine from external contamination | A car's steering wheel: you know how to use it without knowing the engine's inner workings |
2. Encapsulation vs Inheritance
Inheritance is a mechanism where a new class acquires the properties and behaviors of an existing class. It promotes code reuse by allowing you to create new classes based on existing ones, inheriting their attributes and methods. This establishes a hierarchical relationship between classes, where subclasses inherit from superclasses.
Here’s how it compares with encapsulation in OOPS.
Aspect |
Encapsulation |
Inheritance |
Primary Goal | Data hiding and bundling data with related methods | Code reusability and creating a hierarchy of classes |
Implementation | Restricting access to internal data using access modifiers (private, protected, public) | Creating new classes from existing classes, inheriting their attributes and methods |
Focus | Protecting data and controlling access | Extending functionality and establishing "is-a" relationships |
Analogy | A safe that protects valuable items | A family tree where children inherit traits from their parents |
3. Encapsulation vs Polymorphism
Polymorphism is the ability of an object to take on many forms. More specifically, polymorphism means that a call to a member function will cause a different function to be executed depending on the type of object that invokes the function. It enables you to write code that can work with objects of different classes in a uniform way.
Here’s how it differs from encapsulation in OOPS.
Aspect |
Encapsulation |
Polymorphism |
Primary Goal | Data protection and bundling | Flexibility and the ability to treat objects of different classes uniformly |
Implementation | Hiding internal data and providing controlled access | Using interfaces, abstract classes, and method overriding |
Focus | Internal data representation and access control | External behavior and the ability to take on multiple forms |
Analogy | A well-defined box with specific contents and access points | A remote control that can operate different devices |
Here’s a quick comparison between encapsulation and other OOPs Pillars:
Aspect |
Encapsulation |
Abstraction |
Inheritance |
Polymorphism |
Goal | Data protection | Complexity hiding | Code reuse | Flexibility |
Implementation | Access modifiers, getters/setters | Abstract classes, interfaces | Base and derived classes | Overriding and overloading |
Analogy | Medicine capsule | Car dashboard | Family tree | Remote control |
Software designers with enhanced skills in encapsulation in OOPS are in great demand these days. If you are a Python, Java or C++ developer, then learning about encapsulation in object-oriented programming can be an asset to your resume.
upGrad offers numerous courses on encapsulation in OOPS that will help you make your software programs secure and reliable. Here are some of the most popular courses that can help you to learn about encapsulation in OOPS:
Looking for more help with your career plans? upGrad offers free career counseling. These sessions can help you make wise decisions about your career goals.
Unlock the power of data with our popular Data Science courses, designed to make you proficient in analytics, machine learning, and big data!
Elevate your career by learning essential Data Science skills such as statistical modeling, big data processing, predictive analytics, and SQL!
Stay informed and inspired with our popular Data Science articles, offering expert insights, trends, and practical tips for aspiring data professionals!
Get Free Consultation
By submitting, I accept the T&C and
Privacy Policy
Start Your Career in Data Science Today
Top Resources