封装
封装是Java的三大特性之一。封装顾名思义就是包装,在编程领域解释为信息隐藏,利用抽象的数据类型将数据和基于数据的操作封装在一起,构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的实现细节,只保留一些对外使用的方法或者接口来与外部发生联系。系统的其他对象只能通过封装在数据外层的一些有权限的操作(方法)来与这个对象发生交互。也就是我们无需知道对象内部的实现细节,但可以通过该对象开放的对方操作方法或接口来访问该对象。
使用封装的好处:
1、良好的封装能够减少耦合
2、类的内部结构可以自由的修改
3、类可以对成员进行更精确的控制
4、隐藏信息,实现细节
接下来我们看下对封装例子的理解:
public class Husband {
public String name ;
public String sex ;
public int age ;
public Wife wife;
}
如果我们要使用这个对象
Husband husband = new Husband();
husband.age = 30;
husband.name = "张三";
husband.sex = "男";
如果哪一天项目当中这个类型的age属性要修改位String类型,而且用到这个类的地方有几百处,每个赋值都要改成字符串类型,工作量何其大。如果我们使用了封装,只需要稍微修改age属性和setter方法即可。
public class Husband {
private String name ;
private String sex ;
private String age ; // 改成 String类型
private Wife wife;
public String getAge() {
return age;
}
public void setAge(int age) {
//转换即可
this.age = String.valueOf(age);
}
/** 省略其他属性的setter、getter **/
}
在使用这种封装的方法下,项目中原先new出的实例的地方setAge保持不变,设置的int类型的年龄,但实际我们已经用了String类型。到了这里我们可以看出:封装可以很容易的让我们修改类内部的实现,而不需修改使用了该类的客户端代码。
下面我们再来看几个简单的代码例子:
public class Husband {
private String name ;
private String sex ;
private int age ; //改成 String类型
private Wife wife;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 120 || age < 0){
//提示错误信息
System.out.println("ERROR:error age input....");
}else{
this.age = age;
}
}
/** 省略其他属性的setter、getter **/
}
public String getSexName() {
if("0".equals(sex)){
sexName = "女";
}
else if("1".equals(sex)){
sexName = "男";
}
else{
sexName = "人妖???";
}
return sexName;
}
通过以上两个例子可以看出,封装能统一简化很多东西。在类中修改之后,无数用到该类的客户端代码统一修改。
对于封装就讲到这里。下节将讲述继承。