封装
封装(Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
我们程序设计要追求“高内聚、低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部使用。
编程中封装的优点:
- 提高代码的安全性
- 提高代码的复用性
- 高内聚:封装细节,便于修改内部代码,提高可维护性
- “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作
封装的实现 - 使用访问控制符
Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。
Java中4种“访问控制符”分别为private、default、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降低最低,从而提高安全性。
- private:表示私有,只有自己类能访问
- default:表示没有修饰符修饰,只有同一个包的类能访问
- protected:表示可以被同一个包的类以及其他包中的子类访问
- public:表示可以被该项目的所有包中的所有类访问
封装的使用细节
类的属性的处理:
- 一般使用private访问权限
- 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是以is开头的)
- 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰
示例
未使用封装
代码示例如下:
public class EncapsDemo {
String name;
int age;
public void getInfo() {
System.out.println("name: " + name + ", age: " + age);
}
}
测试代码:
public class EncapsDemoTest {
public static void main(String[] args) {
EncapsDemo encapsDemo = new EncapsDemo();
encapsDemo.name = "李四";
encapsDemo.age = 1000;
encapsDemo.getInfo();
}
}
输出结果为:
name: 李四, age: 1000
可以看出,未使用封装的话,很容易赋值错误,任何人都可以更改,造成信息不安全。
使用封装
代码示例如下:
public class EncapsDemo1 {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 0 && age <= 130) {
this.age = age;
} else {
System.out.println("age输入异常!!!,age范围为0到130");
}
}
public void getInfo() {
System.out.println("name: " + this.getName() + ", age: " + this.getAge());
}
}
测试代码:
public class EncapsDemo1Test {
public static void main(String[] args) {
EncapsDemo1 encapsDemo1 = new EncapsDemo1();
encapsDemo1.setName("李四");
encapsDemo1.setAge(1000);
encapsDemo1.getInfo();
}
}
输出结果为:
age输入异常!!!,age范围为0到130
name: 李四, age: 0
可以看出:
- private修饰的成员在自己所在的类中可以使用,在类外边不可以使用,只能通过get/set调用属性
- 在set方法中可以加入逻辑判断,过滤非法数据
示例总结
- 隐藏了类的具体实现
- 操作简单
- 提高对象数据的安全性