在Java SE的学习中,我们会遇到一个概念——封装性。这个词,应该都不陌生,甚至经常会听到,那到底什么是封装性呢?
首先,我们应该了解到 面向对象的三大特征——封装、继承、多态。
我们在设计程序的时候,要追求“高内聚,低耦合”
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅对外暴露少量的方法用于使用
那封装性其实也就是 隐藏对象内部的复杂性,最对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。
通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
如何更生动的理解呢?
这时候,理解起来还是很抽象吧。那就举个例子,比如说,我们买了一台洗衣机,那它的功能我们都知道,有 放水,洗涤,脱水等等。并且功能按键直接在机子外部就显示出来了,我们要执行那个功能,就点相应的按钮即可。那至于其中的运行逻辑和运行组件,我们有必要去了解吗?那当然没必要,我又不去搞什么抽水泵,发动机啥的,我要知道那玩意儿干啥(狗头保命)。所以,这里就有一点封装的概念在里面。把那些复杂的组件和接口连线等等全封装在机箱里,对外呢,只暴露功能按键。我们要执行那个功能,就按下按键,由此来驱动内部的组件运行完成操作。
那这样做有啥好处呢?
- 可以化繁为简吧,想想看,如果一台洗衣机没有外壳的封装,里面光秃秃的几个零件搭建在一起,想想都头皮发麻,说不定拿到手里还得捣鼓好半天。
- 可以便于用户的使用,那些不懂得各个零件怎么操作的,没事儿!我有按钮!哪里想用就点哪里(简直有手就行)
- 另外,也更加安全了。想想看,那些零件不经过封装,暴露在外面,要是一不小心路过的时候踢了一脚,会不会散架?(嘿嘿)所以把它们封装起来使得内部各元素更安全
- 等等
所以,我们也不难由此得出 封装性 的优势:便于使用;提高安全性;提高重用性...
那封装性如何体现呢?
我们将类的属性私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值。
当然这只是一种体现方式,并且这只是体现哦,并不等同于 “封装性”。此外,还有不对外暴露的私有方法、单例模式等等。
这里引入了private、public这几个权限修饰符。所以,封装性的体现,需要权限修饰符来配合。
1、java规定的的4种权限 (从小到大排列):private、缺省、protected、public
2、4种权限可以用来修饰类及类的内部结构: 属性、方法、构造器、内部类
3、具体的: 4种权限都可以用来修饰类的内部结构: 属性、方法、构造器、内部类
修饰类的话,只能用: 缺省、public
public class AnimalTest {
public static void main(String[] args) {
Animal a = new Animal();
a.name = "大黄";
a.age = 1;
// a.legs = 4; //字段 Animal.legs 不可视 (private)
a.show();
a.setLegs(-6);
a.show();
System.out.println(a.name);
// System.out.println(a.legs); 同样也没办法单独的输出legs
System.out.println(a.getLegs()); //由get方法来获取数据
}
}
class Animal{
String name;
int age;
private int legs; //腿的个数
//对属性的设置
public void setLegs(int l) {
if(l>=0 && l%2==0) {
legs = l;
}else {
legs = 0;
}
}
//对属性的获取
public int getLegs() {
return legs;
}
public void eat() {
System.out.println("动物进食");
}
public void show() {
System.out.println("name=" + name + ",age=" + age + ",legs=" + legs);
}
}
在上述代码中,在Animal类的属性定义中,把legs设为了私有(private),并提供了公共方法set和get来设置和读取动物腿的数量。既然已经设为了私有,那我们如果直接对legs进行赋值,肯定是不可以的。如 a.legs = 4; 这是会报错的。必须调用set方法进行赋值,输出时也不能直接syso(a.legs),而是要syso(a.getLegs())。
总结:
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
属性的封装:使用者只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作;
方法的封装:使用者按照既定的方式调用方法,不必关心方法的内部实现,便于使用;
便于修改,增强代码的可维护性;Java提供了4种权限修饰符,来修饰类及类的内部结构,体现了类及类的内部结构在被调用时的可见性的大小。