首先我们通过一个实例来感受一下封装:
class Student{
public int age;
public String name;
public void showInfo(){
System.out.println("Name is:" + this.name + " and age is: " + this.age)
}
}
public class Test{
public static void main(String[] args) {
Student s = new Student();
s.name = "Forlogen";
s.age = -10;
showInfo();
}
}
此时函数的输出为
Name is: Forlogen and age is: -10
可以看出我们可以给对象的name属性赋值,可以正常运行但是却不符合常理,为了满足对于合理性的要求就可以使用封装。另外,如果我们不想让对象直接使用类中的属性变量时,同样可以用到封装的思想。
封装:
封装就是隐藏实现细节,将属性私有化,提供公有方法访问私有属性,通过这些公有方法访问私有属性 。
封装的实现
- 修改属性的可见性来限制对属性的访问
- 为每个属性创建一对赋值(setter)方法和取值(getter) 方法,用于对这些属性的访问
- 在setter和getter方法中,加入对属性的存取限制
对于上面的例子我们用封装再实现一遍:
class Studeng{
private String name;
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
if (age < 0 || age > 150) {
System.out.println("Please use correct age...");
// 此时this.age就是默认值0
} else {
this.age = age;
}
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public void showInfo(){
System.out.println("Name is:" + this.name + " and age is: " + this.age)
}
}
public class FengzhuangDemo {
public static void main(String[] args) {
Student s = new Student();
s.name = "Forlogen";
s.age = -10;
showInfo();
}
}
此时的输出就是:
Please use correct age...
Name is: Forlogen and age is: 0
所以,使用封装增加了数据访问限制,增强了程序的可维护性
封装的优点
- 隐藏一个类的实现细节
- 防止对封装数据的未经授权的访问
- 有利于保证数据的完整性
- 便于修改,增强代码的可维护性
- 有选择地向外界提供数据