Java中的封装
封装被定义为将数据包装在一个单元中。它是将代码和它操作的数据绑定在一起的机制。考虑封装的另一种方式是,它是一个保护屏障,可防止数据被该屏蔽之外的代码访问。
- 从技术上讲,在封装中,一个类的变量或数据对任何其他类都是隐藏的,并且只能通过它自己的声明它的类的任何成员函数来访问。
- 与封装一样,类中的数据使用数据隐藏概念对其他类隐藏,该概念通过将类的成员或方法设为私有来实现,并且该类在不提供任何细节的情况下向最终用户或世界公开背后使用抽象概念实现,因此也称为数据隐藏和抽象的结合。
- 封装可以通过将类中的所有变量声明为私有并在类中编写公共方法来设置和获取变量的值来实现
- 它更多地用 setter 和 getter 方法定义。
访问 EncapsulateDemo 类的变量的程序如下所示:
Java
// Java program to demonstrate encapsulation
class Encapsulate {
// private variables declared
// these can only be accessed by
// public methods of class
private String geekName;
private int geekRoll;
private int geekAge;
// get method for age to access
// private variable geekAge
public int getAge() { return geekAge; }
// get method for name to access
// private variable geekName
public String getName() { return geekName; }
// get method for roll to access
// private variable geekRoll
public int getRoll() { return geekRoll; }
// set method for age to access
// private variable geekage
public void setAge(int newAge) { geekAge = newAge; }
// set method for name to access
// private variable geekName
public void setName(String newName)
{
geekName = newName;
}
// set method for roll to access
// private variable geekRoll
public void setRoll(int newRoll) { geekRoll = newRoll; }
}
public class TestEncapsulation {
public static void main(String[] args)
{
Encapsulate obj = new Encapsulate();
// setting values of the variables
obj.setName("Harsh");
obj.setAge(19);
obj.setRoll(51);
// Displaying values of the variables
System.out.println("Geek's name: " + obj.getName());
System.out.println("Geek's age: " + obj.getAge());
System.out.println("Geek's roll: " + obj.getRoll());
// Direct access of geekRoll is not possible
// due to encapsulation
// System.out.println("Geek's roll: " +
// obj.geekName);
}
}
输出
Geek's name: Harsh
Geek's age: 19
Geek's roll: 51
在上面的程序中,Encapsulate 类被封装为变量被声明为私有。 getAge()、getName()、getRoll() 等 get 方法设置为 public,这些方法用于访问这些变量。 setName()、setAge()、setRoll() 等 setter 方法也被声明为 public,用于设置变量的值。
封装的优点:
- 数据隐藏:用户不知道类的内部实现。用户将看不到该类如何在变量中存储值。用户只会知道我们正在将值传递给 setter 方法,并且变量正在使用该值进行初始化。
- 增加灵活性:我们可以根据我们的要求将类的变量设为只读或只写。如果我们希望将变量设为只读,则必须从上述程序中省略 setName()、setAge() 等设置方法,或者如果我们希望将变量设为只读,则必须省略上述程序中的 getName()、getAge() 等 get 方法
- 可重用性:封装还提高了可重用性,并且很容易随着新的需求而改变。
- 测试代码很容易:封装的代码很容易测试单元测试。