封装的概述
封装应该有两个含义,一是把对象的属性和行为看成一个密不可分的整体,将两者封装在对象中。另一层含义是“信息屏蔽”,把不需要外界知道的信息隐藏起来,有些对象的属性和行为允许外界使用但不允许更改,而有些对象的属性和行为允许外界知道也允许外界更改,但尽量屏蔽对象功能的实现细节
使用封装有三大好处:
1、良好的封装能够减少耦合。
2、类内部的结构可以自由修改。
3、可以对成员进行更精确的控制。
4、隐藏信息,实现细节。
举例说明屏蔽细节
- 举例1
外界在设置性别的时候只知道输入0表示男性,非0表示女性,而不知道具体的实现细节
- 举例2
属性被封装,外界直接不可见,不可以直接访问
如果直接这样封装就和外界断绝了连续,这样也就没有什么实际意义了,所以我们可以在封装的基础上给对象提供和外界交流的通道
通道由公有的getter 和setter方法组成
不封装的坏处举例
可以看成如果不封装的话年龄这个属性可能会被设置成不合理的数值,导致逻辑错误,但这并没有语法错误,编译器并不会报错
封装并提供getter 和setter方法
在入口处设置setter方法可以把握设置的的数据的合理性,避免的前面的错误
对getter 和setter方法的作用的进一步理解
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ;
private Wife wife;
/*
* setter()、getter()是该对象对外开发的接口
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
public class Wife {
private String name;
private int age;
private String sex;
private Husband husband;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public void setHusband(Husband husband) {
this.husband = husband;
}
public Husband getHusband() {
return husband;
}
}
封装步骤的完善
前面阐述了封装的一些过程,用private关键字修饰和用getter和setter方法设置访问出口,但其实还不够完善
在一个类中,在进行属性值的设置,其实官方就给我们提供了专用的构造方法(也叫构造器),当我们将构造方法和我们的封装结合起来才是最完善的封装
总结
在以后的开发过程中只有是编写类中的属性一定要用private进行封装,private封装的属性必须提供相应的getter和setter方法,即便是当前程序中没有调用全部的方法,但作为一个标准的封装,这些都要写出来