1、什么是封装?
封装从字面意思上来理解就是包装的意思,专业一点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留对外接口使之与外部发生联系。
在现实世界中有很多封装的实例,比如“电视”,外部只有一个壳,将内部的元件封装起来,至于他的内部是什么,我们不用关心,只需要用遥控器上的几个按键操作即可。
2、封装有什么好处?
封装之后就形成了独立实体,独立实体可以在不同的环境中重复使用,显然封装可以降低程序的耦合度,提高程序的扩展性,以及重用性和复用性。另外封装可以隐藏内部实现细节,站在对象外部是看不到内部复杂结构的,对外只提供了简单的安全的操作入口,所以封装之后,实体更安全了。
3、不封装存在的问题?
先看以下例子:
public class Test{
public static void main(String[] args){
Person s=new Person();
s.age=-10;
}
}
class Person{
public int age;
}
显然,年龄属性对外暴露,在程序外部可以对age属性随意访问,以上程序将人的年龄设置成一个负数,虽然程序正常编译通过,但是显然是有问题的。
4、怎样进行封装?
- 将属性设置为私有的。
- 对外提供公开的set和get方法作为操作入口。
set和get方法编写规范:
get方法的要求:
public 返回值类型 get+属性名首字母大写(无参){
return xxx;
}
set方法的要求:
public void set+属性名首字母大写(有一个参数){
xxx=参数;
}
下面对以上的程序进行封装:
public class Test{
public static void main(String[] args){
Person s=new Person();
}
}
class Person{
provate int age;
public void setAge(int a){
//可以在此处判断数据的合法性
if(a<0||a>10){
System.out.println("对不起,输入的年龄值不合法,请重新输入!");
return;
}
//程序能运行到这,说明数据合法
age=a;
}
public int getAge(){
return age;
}
}