面向对象的第一大特性叫做“封装”,这是一个比较宽泛的概念,比如类由属性和行为构成,属性和行为可以使用访问修饰符来进行权限控制,等等,这些特性都是属性封装的范畴。广义的概念是指隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。而狭义的封装则是针对类属性而言,在一个类中,属性不应该是公有的,因此需要针对这个属性提供一个访问接口get方法和一个设置接口set方法。
另外一方面,我们也可以利用“封装”的特性来定义一些特殊的类,比如这个类只有属性,没有行为,我们把这种定义方式称之为“失血模型”,定义的类主要用于保存实例的属性,也可以叫做“数据类”,或者“实体类”。
1. Setter和Getter方法
严格来讲属性并不仅仅只是成员变量,我们在设置变量的属性时,我们通常会对数据进行封装,这样就可以增加了数据访问限制,增加了程序可维护性。而实现方法就是:用private去修饰一个变量,然后再用setter方法去设置该变量的值,然后在用getter方法去调用该变量的值。
public class Student {
private String name;
private int score;
private boolean isOk;
// 利用setter修改name的值,并且使用pulibc修饰,可供外界访问
public void setName(String name) {
// 等号左边的name是类成员变量,右边的name是方法的形参的值
this.name = name;
}
// 利用getter获取当前实例的name的值
public String getName() {
return this.name;
}
}这里需要提到的是,如果成员变量是boolean,那么get方法应该改为is,根据上面的类的定义,我们可以使用“setOk()”和“isOk()”对成员变量“isOk”进行操作。
利用setter和getter方法间接操作成员变量的好处是
1)避免了直接对成员变量的操作,减少误操作机率
2)在方法调用中,传递多个参数的场景下,避免了参数的混乱
可以对属性进行检查,比如1000岁的人是不可能存在的,在传入age这个属性时,可以在set中进行一些简单验证操作,以保证数据正确性。
2. 封装对象:
封装对象更利于类与类之间的数据传递,我们在封装对象中填充数据,那么一个对象将表示一个实体或者用户,基于这个理论,我们创建了UserData的封装对象,包括用户名、用户密码、余额、登陆状态等,让它成为一个用户实体类,也可以称为数据类。当这个对象被传递或返回时,其包括的数据也能在对象之间进行传递和返回,get取出就能使用。
3. 定义UserData类:
比如针对WoniuATM系统,我们发现通过数组来保存账户信息都会有一些不当之处,那么我们不妨可以通过定义一个失血模型的数据类,将一个账户信息保存到该数据类的实例当中,当然,多个账户信息可通过定义一个UserData[]的数组来保存即可: