面向对象三大特征之一封装简述
程序自身涵盖两个特点:高内聚 低 耦合
高内聚就是类的内部方法我们自己完成
低耦合低耦合就是仅对外暴露少量方法作为使用
封装的设计思想就是:
把描述一个对象的特性和行为封装成一个类 把具体的业务逻辑功能封装成一个
方法, 隐藏对象内部的复杂性,只对外提供简单的 接口 ,便于外界使用,从而提
高系统可扩展性以及可维护性
例子: 洗衣机仅仅只是为我们提供了外部按钮,既可以完成复杂操作
体现:将类的属性进行私有化(priva te ),同时对外提供公共的(public)方法来获取(getxxx)以及设置(setxxx)
封装没有private、default、protected、public四大修饰符,那就不再是封装。。。
修饰类只能是public以及default(可有可不有)
封装是面向对象三大特征中最好理解的,什么意思呢,说白了,就是要把关键的,没必要给其他人看的逻辑和熟悉密封好,装起来,不让其他人看。
那怎么去做的?对,没错,就是用private!
在方法和属性前边加上private后,就封装了某些属性和某些方法,他们就不会对外公开了。
先说好处:
1、减少其他人看你类的时间,让调用的人看你代码更简单
2、由于属性和某些方法封装起来了,那让你的代码逻辑更安全!
那大家有好多问题了,首先就是质疑以上的两点好处:
1、我写的代码比如Pe rs on这个类,如果我想知道里边的逻辑,我直接打开去看不就好了,private的我也能看到,怎么会减少时间,调用的人看代码怎么会简单?
2、封装起来后我并没有觉得简单啊?代码我还是能看到啊,跟我一起工作的同事也能看到啊?安全在哪里?
如果有这两点疑问很正常,说明大家学的还是很走心的。
那我回答一下第1个问题:
第一种场景:实际工作中,我们写的代码量是远远大于Person这类的,一个类会有几百行甚至上千行,那方法甚至会有几十个,可能这个类就完成几个简单的功能,却有几十个方法来协同工作,所以只需要把这几个简单的功能公开出来就好。
比如Person的年龄每年自增,那如何自增的逻辑没必要让其他人看到吧,因为代码太多,他可能只是需要使用这个类来获取这个人的年龄,所以,把年龄自增的逻辑封装起来(private修饰符),仅仅提供一个获取年龄的方法就可以了(public修饰符)。
这样调用你的类同事是不是只要去看你公开了哪些可以使用的方法就可以了?一般方法都会有注释,我前边讲过的注释规则还记得吧,注释中一般都会写着这个方法是做什么用的,那大家使用你这个类的时候,是不是只要看公开的public的方法和属性以及他们的注释就足够了,没必要读完整个类,毕竟大家都挺忙的,需要争分夺秒完成任务。
第二种场景:在实际工作中很多逻辑其实并不是自己写的,怎么说呢?比如文件读取操作,使用的是系统IO操作的类库,这些类库直接通过import导入类就可以使用了,那这些类代码更多,成千上万行,那你能去通读吗?显然是很难做到的,所以他们封装了很多 操作,提供出来几十个公开的方法,这样你看公开的方法和 java doc就可以了(/**.。..*/这种方式的注释生成的文档,就是javadoc,前边讲注释的时候提到过)
第三种场景:如果我们去写代码,时间长了,发现有些东西经常用,比如时间日期的工具类,那我们也可以把它做成类库(jar或者aar的形式),我们习惯称做sdk也就是软件开发工具(Software Development Kit),那这些类库是提供给你同事或者其他合作伙伴用的,他们也是不会去关心你是怎么实现的,只需要关系是不是有他们需要的功能,那这些功能公开出来就可以了,其他的东西都private封装好,这样他们读起来是不是就简单多了。
说了这么多场景,不知道大家有没有明白,我再举个生活上的例子吧,辅助大家理解:比如最近天气很热,大家使用 空调 , 遥控器 是public的吧,大家都能看到,也有说明书(javadoc),那大家就直接使用了,不用去关心如何实现的调高温度、调低温度、风量控制这些吧!
再回答第2个问题:
关于安全方面,比如人类这类你们公司经常用,你要把他打包到通用的sdk中,那如果你把年龄这个字段写成了public,或者你公开了一个set方法
public void setAge(int age) {
this.age = age;
}
那这个年龄很有可能被其他人调用了setAge或者直接person.name=12,这样修改了年龄!实际上年龄应该是走你的算法,每年递增,比如去年1岁,今年2岁,那你突然给它设置个12岁,那这个人的年龄就会出问题!所以要做封装,这样数据才会安全!
这仅仅是最基础的安全,如果后边讲到多线程,还会涉及数据安全的问题,也是可以通过private来降低一些线程导致的数据问题。