Undertanding Encapsulation in Java

Undertanding Encapsulation in Java

15 Jan 2025
Beginner
640 Views
39 min read
Learn with an interactive course and practical hands-on labs

Free Java Course With Certificate

Java Encapsulation

Encapsulation is an object-oriented Programming concept that combines data and methods into a single unit called class while restricting direct access to certain components.This ensures better security, simplifies code, and makes maintenance easier. To deepen your knowledge, explore our Java Online Course Free With Certificate for a structured learning experience.

In this Java Tutorial, we will explore everything about encapsulation in Java,including what Java encapsulation is, how encapsulation works in Java,the benefits of encapsulation in Java,etc.

What is Encapsulation?

Encapsulation means wrapping up data and methods in a single unit, like a class, to keep it safe. It lets you control how others access your data by using getters and setters. Think of it as locking your valuables in a box and giving access only when necessary. Isn't it great to protect your data this way?

What is Encapsulation in Java?

Encapsulation in Java is achieved by making class fields (data members) private but offering public getter and setter methods for accessing and updating these fields. This restriction over data access ensures that data is only modified via well-defined interfaces, protecting the object's internal state.

What is Encapsulation in Java

Key Points of Encapsulation:

  • Data Hiding: It limits the visibility of internal object states and only enables access to public methods.
  • Controlled Access: The usage of getter and setter methods allows for controlled access to variables.
  • Flexibility: The internal representation of the data can change without affecting the external code that relies on it.
Explore More:
Java Abstraction
Java Inheritance (Single, Multiple, and Hierarchical)
Java Polymorphism (Compile-Time and Runtime)

Implementing Java Encapsulation

Implementing Encapsulation in Java means using private variables to restrict direct access and providing public getter and setter methods to control data access. This ensures your data stays safe while allowing controlled interaction. Here's an example:

Example


class Student {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class MainClass {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("Shailesh");
        System.out.println("Student Name: " + student.getName());
    }
}

Output


Student Name: Shailesh
    

Advantages of Encapsulation

Encapsulation offers a range of benefits, like data security and flexibility. By hiding the internal details and only exposing necessary methods, you ensure that your data is protected from unauthorized access and modification. Some of the key advantages are listed below:

  • Data Protection: It keeps your data secure by hiding the implementation details and preventing unauthorized access.
  • Improved Maintainability: You can modify the internal workings of a class without affecting other parts of the system.
  • Code Reusability: It encourages reusable code components, making your codebase more efficient and manageable.
  • Easier Debugging: Since access to data is controlled, tracing errors becomes more straightforward.
  • Flexibility and Control: You can control how data is accessed and modified, ensuring that changes don’t disrupt other parts of the program.
  • Improved Security: Sensitive data is protected, as you can restrict access and only allow safe interactions.
  • Better Abstraction: It allows you to focus on the important features of an object, hiding the complexity from the user.
  • Reduced Complexity: By encapsulating complex logic, you make your code easier to understand and use.

Disadvantages of Encapsulation

While encapsulation offers many advantages, it also has some drawbacks that you should be aware of. Here are the key disadvantages:

  • Increased Complexity: It can make the code more complex due to the additional layers of abstraction and encapsulated methods.
  • Slower Performance: Accessing data through methods can be slower compared to directly accessing variables, which might impact performance in certain situations.
  • More Code: Encapsulation requires more lines of code for getter and setter methods, leading to larger classes.
  • Reduced Flexibility: Over-restricting access to data might hinder the flexibility of the system, especially in scenarios where direct access would be more efficient.

Data Encapsulation in Java Examples

Data Encapsulation in Java is a technique used to restrict access to specific details of an object and only expose necessary parts through getter and setter methods. This helps in protecting the object's data and ensuring data integrity. Below are examples demonstrating different scenarios of encapsulation:

Example 1: Basic Data Encapsulation


class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class MainClass {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Aman");
        System.out.println("Person Name: " + person.getName());
    }
}
    

Output


Person Name: Aman
    

Explanation

In this example, the private field name is encapsulated within the Person class. The getter getName() is used to access the value of the name field, while the setter setName() is used to set its value. The data is safely accessed and modified using public methods, ensuring the principle of encapsulation is followed.

Example 2: Data Encapsulation with Validation


class Employee {
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if (age > 18) {
            this.age = age;
        } else {
            System.out.println("Age must be greater than 18");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Employee employee = new Employee();
        employee.setAge(25);
        System.out.println("Employee Age: " + employee.getAge());
        employee.setAge(16);
    }
}  

Output


Employee Age: 25
Age must be greater than 18
    

Explanation

This example demonstrates data encapsulation with validation. The setter method setAge() not only sets the age but also checks if the age is greater than 18. If the age is invalid, an error message is printed, preventing incorrect data from being set. The getter method getAge() safely retrieves the value of the age.

Example 3: Encapsulation with Multiple Fields


class Car {
    private String model;
    private int year;    public String getModel() {
        return model;
    }    public void setModel(String model) {
        this.model = model;
    }    public int getYear() {
        return year;
    }    public void setYear(int year) {
        if (year > 2000) {
            this.year = year;
        } else {
            System.out.println("Year must be after 2000");
        }
    }
}public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.setModel("Honda Civic");
        car.setYear(2021);
        System.out.println("Car Model: " + car.getModel());
        System.out.println("Car Year: " + car.getYear());        car.setYear(1999);
    }
}   

Output


Car Model: Honda Civic
Car Year: 2021
Year must be after 2000
    

Explanation

In this example, multiple fieldmodelsandyearsareencapsulatedwithinthecarcass.The setter setModel() and setYear() methods are used to set the values. The setYear() method includes validation to ensure that the year is greater than 2000. The getter methods getModel() and getYear() allow safe access to these values, demonstrating the use of encapsulation with multiple fields.

Data Hiding in Java

Data hiding is a key feature of encapsulation in Java, which allows the restriction of access to certain fields and methods. This is achieved using Access Modifiers in Java, which determine the visibility of class members. Java provides four main access modifiers: Default, Public, Private, and Protected. Below are examples demonstrating how these modifiers work:

1. Default Access Modifier

When no access modifier is specified, Java uses the default access level. This means that the member is accessible only within the same package.


class DefaultAccess {
    String name = "Shailesh"; // default access

    public static void main(String[] args) {
        DefaultAccess obj = new DefaultAccess();
        System.out.println("Name: " + obj.name); // accessible within same package
    }
}    

Output


Name: Shailesh
    

Explanation

The default access modifier allows the name variable to be accessed within the same package. Since no explicit access modifier is provided, the class is able to access the name variable without restrictions within the same package. However, if this class were in a different package, it would not be able to access this variable.

2. Public Access Modifier

The public access modifier allows a class, method, or field to be accessed from anywhere, both inside and outside the class and package.


public class PublicAccess {
    public String name = "Aman"; // public access

    public static void main(String[] args) {
        PublicAccess obj = new PublicAccess();
        System.out.println("Name: " + obj.name); // accessible from anywhere
    }
}    

Output


Name: Aman
    

Explanation

The public access modifier allows the name variable to be accessed from anywhere, even outside the class and package. As shown, this variable can be directly accessed in the main method, regardless of the package location.

3. Private Access Modifier

The private access modifier restricts the member from being accessed outside its own class. This provides the highest level of data hiding.


class PrivateAccess {
    private String name = "Pradnya"; // private access

    public static void main(String[] args) {
        PrivateAccess obj = new PrivateAccess();
        // System.out.println("Name: " + obj.name); // compile-time error: name has private access
    }
}    

Output


// Error: name has private access
    

Explanation

The private access modifier restricts access to the name variable from outside the PrivateAccess class. Attempting to access the name variable outside the class results in a compile-time error. This is the highest level of data hiding in Java, providing complete protection of class fields.

4. Protected Access Modifier

The protected access modifier allows access within the same package and by subclasses (including those in different packages).


class ProtectedAccess {
    protected String name = "Aman";
}class MainClass {
    public static void main(String[] args) {
        SubClassAccess obj = new SubClassAccess();
        System.out.println("Name: " + obj.name);
    }
}class SubClassAccess extends ProtectedAccess {
}    

Output


Name: Aman
    

Explanation

The protected access modifier allows access to the name variable within the same package as well as in subclasses (even if they are in different packages). As shown, the subclass SubClassAccess can access the name field of the parent class ProtectedAccess, demonstrating the inheritance feature of the protected modifier.

Data Hiding vs. Encapsulation in Java

Data Hiding and Encapsulation are closely related concepts in Java, but they serve different purposes. Data hiding focuses on restricting access to certain parts of an object’s data, while encapsulation is the broader concept that bundles data and methods together and controls access using access modifiers. Here’s a breakdown of the key differences:

AspectData HidingEncapsulation
DefinitionRestricting access to the internal state of an object makes it invisible to outside classes.Bundling data (variables) and methods that operate on the data into a single unit (class) and restricting access to the inner details.
GoalProtecting the object's data by hiding it from unauthorized access or modification.To protect and control access to the data by providing a controlled interface (getter and setter methods).
VisibilityData is hidden from other classes by using private access modifiers.Data and methods are grouped together within a class, and access to data is controlled through methods.
AccessData is accessed via public methods (getters/setters) if needed.Data is accessed through getter and setter methods, allowing controlled access to the data.
ImplementationAchieved by making fields private and providing public getter and setter methods.Achieved by creating a class with private data and providing public methods to access and modify that data.
Exampleprivate int age; (data is hidden) with getter/setter methods to access it.class Person { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

Getter and Setter Methods in Java

Getter and Setter methods are used to access and update the values of private variables in a class. These methods provide controlled access to the data, ensuring that the values are manipulated in a safe and consistent way. The getter method retrieves the value of a private variable, while the setter method allows modifying its value.

Example


class Employee {
    private String name; 
    private int age;     // Getter method for name
    public String getName() {
        return name;
    }    // Setter method for name
    public void setName(String name) {
        this.name = name;
    }    // Getter method for age
    public int getAge() {
        return age;
    }    // Setter method for age
    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        } else {
            System.out.println("Age must be greater than 0");
        }
    }
}class MainClass {
    public static void main(String[] args) {
        Employee emp = new Employee();
        
        // Setting values using setter methods
        emp.setName("Shailesh");
        emp.setAge(25);        // Getting values using getter methods
        System.out.println("Employee Name: " + emp.getName());
        System.out.println("Employee Age: " + emp.getAge());
    }
}

Output


Employee Name: Shailesh
Employee Age: 25
    

Explanation

In this example, the Employee class uses private variables for name and age, with getter and setter methods to access and modify them. The setter for age includes a validation check to ensure it's greater than 0, demonstrating how encapsulation helps maintain data consistency.

The CoffeeMachine Example in Java

Let’s consider a simple example of a Coffee Machine that uses methods to simulate the process of making coffee. We will use encapsulation to hide the internal details and provide public methods for controlling the machine's functionality. Here's how we can represent a CoffeeMachine class:

Example


class CoffeeMachine {
    private boolean waterHeated; // private variable
    private boolean coffeeBrewed; // private variable

    // Method to heat water
    public void heatWater() {
        waterHeated = true;
        System.out.println("Water is heated.");
    }

    // Method to brew coffee
    public void brewCoffee() {
        if (waterHeated) {
            coffeeBrewed = true;
            System.out.println("Coffee is brewed.");
        } else {
            System.out.println("Water is not heated. Please heat water first.");
        }
    }

    // Method to serve coffee
    public void serveCoffee() {
        if (coffeeBrewed) {
            System.out.println("Serving the coffee.");
        } else {
            System.out.println("Coffee is not brewed. Please brew the coffee first.");
        }
    }
}

class MainClass {
    public static void main(String[] args) {
        CoffeeMachine coffeeMachine = new CoffeeMachine();
        
        // Using the methods to simulate coffee-making process
        coffeeMachine.heatWater(); // Heating water
        coffeeMachine.brewCoffee(); // Brewing coffee
        coffeeMachine.serveCoffee(); // Serving the coffee
    }
}

Output


Water is heated.
Coffee is brewed.
Serving the coffee.
    

Explanation

In the CoffeeMachine class, encapsulation is used to hide internal details, like whether the water is heated or coffee is brewed. The class provides three methods: heatWater(), brewCoffee(), and serveCoffee(). The heatWater() method sets the water as heated, while brewCoffee() ensures the water is heated before brewing. The serveCoffee() method serves coffee only if brewed. Encapsulation ensures that users interact with the machine through controlled methods, keeping the internal state valid and consistent.

Benefits of Encapsulation in Java

Encapsulation is one of the core concepts of object-oriented programming (OOP). It refers to the bundling of data (variables) and methods that operate on the data into a single unit or class. By restricting direct access to some of an object's components, encapsulation helps safeguard the object's internal state. Here are the key benefits of using encapsulation in Java:

1. Data Hiding

Encapsulation helps in hiding the internal state of an object from the outside world. This ensures that the object's data is accessed and modified only through the provided methods (getters and setters), preventing unauthorized access and modification.

2. Improved Code Maintainability

Encapsulation allows the internal implementation of a class to be changed without affecting the rest of the code. As long as the interface (the public methods) remains the same, the internal logic can be modified, which improves code maintainability and reduces the risk of breaking existing functionality.

3. Control over Data

With encapsulation, you can add validation inside the setter methods. This means you can control what data is set to the variables, ensuring that invalid or undesirable data is never assigned to the object's attributes. For example, you can prevent the age of a person from being set to a negative value.

4. Easier Debugging and Testing

Encapsulation makes it easier to debug and test your program. Since the class hides its implementation, you can focus on testing the public interface (the methods) without worrying about how the data is stored or manipulated internally.

Read More: A Deep Dive into C# Interface

5. Flexibility and Reusability

Encapsulating data within a class provides flexibility, allowing you to reuse the class in different contexts. Other objects can interact with your class using its public interface without needing to know the details of its implementation.

6. Reduced Complexity

Encapsulation simplifies the interaction with objects. The user only needs to know the available methods to interact with the class without being concerned about the class's internal workings, leading to reduced complexity in the codebase.

7. Improved Security

By restricting access to the internal data and making it available only through methods, encapsulation adds a layer of security to the application. It prevents unintended access or modification of the object's state, thus protecting the integrity of the data.

Summary

This article covered the core concept of encapsulation in Java, explaining how it combines data and methods to enhance data security and modularity. By using access modifiers like private, protected, and public, you can control the visibility of your data, ensuring its protection and providing clear communication between classes. Whether you’re new to Java or refining your skills, encapsulation is essential for writing maintainable and secure code.

Scholarhat Master Classes offer comprehensive, in-depth training across various technologies, including Java, ReactJS, Python, and more. These classes are designed for professionals looking to strengthen their expertise and stay ahead in the tech industry. Gain practical experience and master advanced concepts. Join now to boost your career in programming!

Test Your Knowledge on Java Encapsulation!

Q 1: What is the main purpose of encapsulation in Java?

  • (a) To hide the implementation details from the user
  • (b) To make all variables public
  • (c) To implement inheritance
  • (d) To increase the performance of the program

Q 2: Which access modifier is used to implement encapsulation in Java?

  • (a) private
  • (b) public
  • (c) protected
  • (d) default

Q 3: How do you provide access to a private variable in Java?

  • (a) By directly accessing the variable
  • (b) By using getter and setter methods
  • (c) By using the public access modifier
  • (d) By using a constructor

Q 4: Which of the following is NOT a benefit of encapsulation?

  • (a) Increased security of data
  • (b) Improved code readability
  • (c) Easier maintenance of code
  • (d) Allows direct access to private fields

Q 5: Which of the following is the correct way to define a setter method for a variable `name` in a Java class?

  • (a) public void setName(String name) { this.name = name; }
  • (b) public void setName() { this.name = name; }
  • (c) private void setName(String name) { this.name = name; }
  • (d) public String setName(String name) { this.name = name; }

FAQs

Encapsulation can used when dealing with secure data or methods because it can restrict which functions or users have access to certain information.

Encapsulation is one of the fundamentals of OOP (object-oriented programming). It refers to the bundling of data with the methods that operate on that data. 

In object-oriented programming (OOP), encapsulation is the practice of bundling related data into a structured unit, along with the methods used to work with that data
Share Article
About Author
Shailendra Chauhan (Microsoft MVP, Founder & CEO at ScholarHat)

Shailendra Chauhan, Founder and CEO of ScholarHat by DotNetTricks, is a renowned expert in System Design, Software Architecture, Azure Cloud, .NET, Angular, React, Node.js, Microservices, DevOps, and Cross-Platform Mobile App Development. His skill set extends into emerging fields like Data Science, Python, Azure AI/ML, and Generative AI, making him a well-rounded expert who bridges traditional development frameworks with cutting-edge advancements. Recognized as a Microsoft Most Valuable Professional (MVP) for an impressive 9 consecutive years (2016–2024), he has consistently demonstrated excellence in delivering impactful solutions and inspiring learners.

Shailendra’s unique, hands-on training programs and bestselling books have empowered thousands of professionals to excel in their careers and crack tough interviews. A visionary leader, he continues to revolutionize technology education with his innovative approach.
Accept cookies & close this