Java 中的封装是一种面向对象编程的重要特性,可以将数据和方法封装在类中,并对外部隐藏实现细节。封装的目的在于保护数据的安全性和完整性,同时提高了代码的复用性和可维护性。
封装主要体现在以下几个方面:
- 将类的成员变量定义为 private,只能在类中访问,并提供 getter、setter 方法来访问和修改数据。这样可以有效保护数据的安全性,避免外部对数据进行非法的访问和修改。
例如,下面这个类就将 name 和 age 两个属性定义为 private,再分别提供了对应的 getter 和 setter 方法:
public class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
2. 对外提供一些公共方法,用来操作数据,这样就不会暴露内部实现的细节。这些公共方法可以是方法的参数和返回值,或者是对象的行为。
下面是一个简单的例子,其中定义了一个 Car 类,可以使用 start() 方法启动汽车:
public class Car {
private boolean started = false;
public void start() {
if (!started) {
// 启动汽车的代码
started = true;
}
}
}
在汽车启动的时候,Car 类内部可以执行很多操作,如检查电池电量、判断机油温度、点火等,但这些细节并不需要外部知道,所以只需要将启动方法 public 化即可。
- 隐藏类的内部细节,只暴露必要的接口给外部使用。这样可以避免已经使用的类被修改而带来的代码风险和修改代价。
例如,下面这个类的内部实现使用了数组 arr 来存储数据,但是对外只提供了 add() 和 get() 方法,使用方只能通过这两个方法来操作数据,而不需要关心数据的具体存储实现:
public class MyList {
private int[] arr = new int[10];
private int size = 0;
public void add(int elem) {
if (size >= arr.length) {
int[] newArr = new int[arr.length * 2];
System.arraycopy(arr, 0, newArr, 0, arr.length);
arr = newArr;
}
arr[size++] = elem;
}
public int get(int index) {
if (index >= 0 && index < size) {
return arr[index];
}
throw new IndexOutOfBoundsException();
}
}
这样,使用方只需要调用 add() 和 get() 方法即可实现对数据的添加和获取,而不需要了解 MyList 类内部的实现细节。
总之,Java 的封装是一种重要的面向对象编程特性,可以将数据和方法封装在类中,保护数据的安全性和完整性,并提高代码的复用性和可维护性。通过使用 private 修饰成员变量、公共方法等,可以对外隐藏类的内部细节,只暴露必要的接口给外部使用。