封装
-
封装(英语:Encapsulation)
- 在面向对象中封装是指隐藏对象的属性和实现的细节,仅对外提供公共访问方式。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点
- 提高数据的安全性(类内部的结构可以自由修改,隐藏信息和实现细节,私有属性都使用private修饰)。
- 良好的封装能够减少耦合
- 提高了代码的重用性,封装成工具类以后能够减少很多繁琐的步骤
DEMO体现
根据Java的语法,类的属性只有是private时即便是同包的类也无法直接使用该依赖类的私有属性(内部类除外);
因此private是封装的最好修饰方式。
public class Student {
public String name ;
public int sex ;
public int age ;
}
我们可以直接调用其属性
Student student = new Student();
student.age = 30;
student.name = "张三";
student.sex = 1; //我们数据中保存的0:女,1:男
System.out.println(student.sex);
显然当我们要输出时输出的是数字,但当写student类的人把该类的属性屏蔽,并不想让你直接操作时,那么你就无法使用该方式操作该类的属性值。
只能通过对方提供的公共方法操作,特别是当我们需要输出性别为实际含义时,这种方式显然会让我们调用的地方增加判断性别的代码。但作为调用者
我们并不想关心你这些细节,我只用调用你的方法,你给我想要的东西就可以了。
public class Student {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private int sex ;
private int age ;
public void Student(String name,int sex,int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getSex() {
return this.sex==0?"女":"男";
}
public void setAge(int age) {
//转换即可
this.age = String.valueOf(age);
}
/** 省略其他属性的setter、getter **/
}
这样调用的地方就很简洁,而不像上方的方法写出很多行
Student student=new Student("zhagn san",1,20);
System.out.println(student.getSex());//直接可以输出:男
到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。
我们在看这个好处:可以对成员变量进行更精确的控制。
调用者可以更专注于接口和结果,而无需关心其具体实现方式,减少对调用者的代码量也就意味着减少了耦合,使调用方和被调用方各自专注于自己的内部实现。
特别是当调用者增多时,可以明显看到代码冗余量的减少。