Encapsulation in Java is the process of wrapping code and data together into a single unit. Encapsulation hides the implementation details from the users. If the data member is private then it can be accessed only within the same class . No other outside class can access the private member of other class.
Lets take a look into the below code
class StudentBean { private int studentId; private String studentName; } public class EncapsulationExample { public static void main(String args[]) { StudentBean sb = new StudentBean(); sb.studentId=10; sb.studentName ="JIP"; } }
We are setting the values for the studentId and studentName in EncapsulationExample class, when we run the above we will be getting the below exception as private variables are not visible to other classes. This way you are completely encapsulating the data member and all the changes are allowed only inside the same class.
Exception in thread "main" java.lang.Error: Unresolved compilation problems: The field StudentBean.studentId is not visible The field StudentBean.studentName is not visible at com.javainterviewpoint.EncapsulationExample.main(EncapsulationExample.java:27)
If we have public getters and setters method then the private variable can be accessed by other outside class using those public methods. Lets modify the above code a bit.
class StudentBean { private int studentId; private String studentName; public int getStudentId() { return studentId; } public void setStudentId(int studentId) { this.studentId = studentId; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } } public class EncapsulationExample { public static void main(String args[]) { StudentBean sb = new StudentBean(); //Setting values sb.setStudentId(99); sb.setStudentName("JIP"); //Retrieving the values System.out.println("Student Id : "+sb.getStudentId()); System.out.println("Student Name : "+sb.getStudentName()); } }
In the above code we are setting the values to studentId and studentName using the setters and retrieving the set values using the getters
Output :
Student Id : 99 Student Name : JIP
Why we use encapsulation in Java ?
- Encapsulation increases the maintianability of the code without any break. In the above code implementation of the methods (setters and getters) can be changed at any point of time as the implementation is purely hidden and the users will not be impacted as they will be still using the same method and accessing the same variable.
- Provides you the better control over the data, suppose if you want the values which greater than 500 alone to be set, then you can simply write the restriction logic in the setter method. In the below code we have wrote the restriction logic which restricts the studentMarks can be set only when it is greater than 500.
class StudentBean { private int studentId; private String studentName; private int studentMarks = 10; public int getStudentId() { return studentId; } public void setStudentId(int studentId) { this.studentId = studentId; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public int getStudentMarks() { return studentMarks; } public void setStudentMarks(int studentMarks) { if(studentMarks > 500) this.studentMarks = studentMarks; } } public class EncapsulationExample { public static void main(String args[]) { StudentBean sb = new StudentBean(); //Setting values sb.setStudentId(99); sb.setStudentName("JIP"); sb.setStudentMarks(45); //Retrieving the values System.out.println("Student Id : "+sb.getStudentId()); System.out.println("Student Name : "+sb.getStudentName()); System.out.println("Student Marks : "+sb.getStudentMarks()); //Set the value for studentMarks greater than 500 sb.setStudentMarks(600); System.out.println("New Student Mark : "+sb.getStudentMarks()); } }
- You can make the fields read-only or write-only.
- Fields can be made read-only, if we didn’t define the setter methods for the variables and hence values cannot be changed.
- Fields can be made write-only, if we didn’t define the getter methods.
Anil Nivargi says
Nice explanation….thanks for sharing..