封装
知识框架:
封装的理解
封装从字面上来理解就是包装的意思,专业理解就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能的隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。
封装的好处:
封装之后就形成了独立实体,独立实体可以在不同的环境中重复使用,封装可以降低程序的耦合度,提高程序的扩展性,以及重用性或复用性。另外封装可以隐藏内部实现细节,在对象外部是看不到内部复杂结构的,对外只提供了简单的安全的操作入口,所以封装之后,实体更安全了。
封装的代码实现
封装的第一步:将应该隐藏的数据隐藏起来,在外部是无法随意访问这些数据的。在java语言中使用private修饰符,private修饰表示数据是私有的,私有的数据只能在本类中访问。
封装的第二步:对外提供公开的访问入口,让外部程序统一通过这个入口去访问数据,我们可以在这个入口处设立关卡,进行安全控制,从而对象内部的数据就安全了。
对于一个属性来说,一般对外提供的访问入口有两个,这两个方法通常被称为set(修改)方法和get(读取)方法。
注意:set 和get 方法访问的都是某个具体对象的属性,不同的对象调用get 方法获取的属性值不同,所以set 和 get 方法必须有对象的存在才能调用, 这样的方法定义的时候不能使用static 关键字修饰,被称为实例方法。实例方法必须使用“引用”的方式调用。
总结:
在java 语言中封装的步骤应该是这样的:需要被保护的属性使用private 进行修饰,给这个私有的属性对外提供公开的set 和 get 方法,其中set 方法用来修改属性的值,get 方法用来读取属性的值。并且 set 和 get 方法在命名上也是有规范的,规范中要求 set 方法名是set + 属性名(属性名首字母大写),get 方法名是get + 属性名(属性名首字母大写)。其中set 方法有一个参数,用来给属性赋值,set 方法没有返回值,一般在set 方法内部编写安全控制程序, 因为set 方法是修改内部数据的,而 get 方法不需要参数,返回值类型是该属性所属类型。(另外set 方法和 get 方法都不带static 关键字,不带static 关键字的方法称为实例方法,这些方法调用的时候需要先创建对象,然后通过“引用”去调用这些方法,实例方法不能直接采用“类名”的方式调用。)
例:请通过代码封装,实现如下需求:
编写一个类Book,代表教材:
1.具有属性:名称(title)、页数(pageNum)
2.其中页数不能少于200页,否则输出错误信息,并赋予默认值200
3.为各属性提供赋值和取值方法
4.具有方法:detail,用来在控制台输出每本教材的名称和页数
5.编写测试类BookTest进行测试:为Book对象的属性赋予初始值,并调用Book对象的detail方法,看看输出是否正确
public class Test01{
//主函数,入口
public static void main(String[] args){
Book1 b1 = new Book1("Java程序设计",320);//定义java程序设计这本书
b1.detail();
System.out.println();
Book1 b2 = new Book1("C语言程序设计",180);//定义C语言程序设计这本书
b2.detail();//打印详细信息
b2.setPageNum(210);//修改页数
b2.getPageNum();//获取修改后的页数
Book1 b3 = new Book1();//创建无参对象,默认书名为空,页数为0
System.out.println();
b3.detail();
}
}
class Book1{//book类
private String title;//名称
private int pageNum;//页数
//无参构造方法
public Book1(){
title = "未知";
pageNum = 0;
}
//有参构造方法
public Book1(String s,int i){
title=s;
if(i < 200){
pageNum = 200;
System.out.println(s+":页数少于200页,则默认设置为200页");
}
else{
pageNum=i;
}
}
//修改书名
public void setTitle(String name){
title = name;
System.out.println("修改之后书的书名为:"+ name);
}
//获取书名
public String getTitle(){
return title;
}
//修改页数
public void setPageNum(int n){
if(n < 200){
System.out.println("对不起,您输入的页数不合法!");
//默认值200
pageNum = 200;
return ;
}
//页数大于等于200
pageNum = n;
System.out.println("修改之后书的页数为:"+ n);
}
//获取页数
public int getPageNum(){
return pageNum;
}
//datail方法
public void detail(){
System.out.println("该书的名称为:" + title +",总页数为:" + pageNum);
}
}