Java面向对象之封装的理解
参考价值:已完结、但不一定正确、参考价值较高、但不能作为标准答案、等待重置
什么才算是Java面向对象?
很多人把面向对象的内容学完了都搞不懂这个问题。
Java面向对象的知识大概分为三个部分类以及其成员、关键字和面向对象的特征。
那么,用类和关键字写的程序就是面向对象吗?
显然不是,Java也是可以写面型过程的,比如我就经常用Java的类和关键字写面向过程。
那么,究竟什么样的程序才称得上是面向对象呢?
答案:用类和关键字写的具有面向对象特征的程序是面向对象的程序。
所以说面向对象的知识中,类和关键字只是工具,面向对象的特征才是灵魂。
那么,这篇文章我们来谈谈面向对象中的封装特性。
什么是封装?
封装就是字面上的意思,就是打包。
然而,严格上来说,这里的封装还有隐藏的意思。
也就是打包的同时不能让“包”外面的人看到包里面的东西,更不能让包外面的人私自动包里的东西。也就是很多老程序员所说的黑盒。
封装有什么好处?
不容易出那种很恐怖的bug:
有一种很恐怖的bug相信很多人都遇到过:改好了这里,那边就出问题了,那边改好了,另一边又出问题了。
封装就能很好的解决这种问题,因为被封装的个体相互独立型很强,不容易出现那种连锁的bug。就算出现了,由于封装性低耦合的特点也很容易顺藤摸瓜找到bug。
安全性高:
因为,封装具有隐藏的特点,所以黑盒内部的代码权限被限制的死死的外界想要随意调用是不可能的。因此,黑盒内的信息只要权限限制的好,安全性都会非常的高。
便于修改:
因为各种功能都被封装成一个个的黑盒,彼此之间相互独立。所以当我们需要为程序添加新功能时,只需要新建一个黑盒即可,不需要考虑太多别的代码的影响。
封装的要求是什么?
说到封装的要求就需要分成封装和隐藏两个部分展开。
封装的要求:
也就是怎么把功能打包成盒子。
把功能打包要遵循高内聚和低耦合的原则:
内聚:
内聚是指黑盒内代码的联系性。
==高内聚==是指黑盒内部的代码必须保持高度的联系性,如果联系性不高,那就删掉,不能删就拆成两个或者多个黑盒。以此来提高内聚性。
耦合:
耦合就是指模块与模块之间的联系,也就是黑盒与黑盒之间的联系。
==低耦合==就是尽量减少黑盒之间的联系,如果耦合很强,并且降低不了你,那就合并成一个黑盒。
高内聚和低耦合的目的就是让打包起来的黑盒具有高度的独立性。
隐藏的要求:
一句话概括:用不到的权限就别给!
隐藏的主要目的是为了安全,防止在黑盒外通过除了黑盒提供的接口(不是关键字那个接口)以外的途径调用黑盒内部的信息。因此,在黑盒内的代码要严格限制其权限不要闭着眼都给public,能少给就少给,千万别多给。
怎么完成封装?
还是分为封装和隐藏两个部分来讲:
封装:
其实没啥可说的,就是遵循高内聚、低耦合的原则进行封装,内聚低了就拆,耦合高了就合并。用多了就有经验了。
隐藏:
隐藏说白了也就是权限的事,知道怎么限制权限也就知道了怎么隐藏。
权限限制通过四个权限修饰符来实现,分别是:private、缺省、protected和public。
他们对权限的限制如下图所示:
特别提醒:
类的属性必须设置成private
类的方法因其需要给与不同的权限,用不到的地方不要给。
类(不包括内部类)的权限不能是private。
特别提醒:
黑盒到底是啥?
有的同学疑问黑盒到底是类还是方法?
其实都是,只要是被封装了,都是黑盒。而且黑盒一般都是黑盒套黑盒。比如说,我设计一个学生信息管理系统,其中学生成绩管理是一个黑盒,而学生成绩管理下的增删改查也都是一个一个的黑盒,甚至存储学生信息的线性表也是一个黑盒。只不过他们有的是方法、有的是类。这也是为什么说面向对象里万物皆对象,万物皆黑盒(不用去百度,后面这句是我加的)的原因。
面向对象的程序设计的规范
初次接触面向对象的小伙伴们可能会觉的面向对象好自由,万物皆对象,想把谁当对象都行,爱咋封装咋封装。这也导致很多程序写的五花八门,有的简直没眼看。
实际上,面向对象确实自由,但也不是无限自由,封装的好叫黑盒,封装的不好,写了一个高耦合低内聚的程序,那就不叫黑盒了,那叫透明玻璃缸(比如刚学面向对象时的我)。
所以说,当大家严格遵守封装的特性去设计面向对象的程序时,我们的程序的质量就会提升起来。这也是为什么有的人写的面向对象的程序说不出来哪里好,但就是感觉比自己高级,实际上是他们把握住了面向对象的三大特性,其中之一就有封装。
给大家一个学生成绩管理系统的代码,看看大家能不能体会到面向对象的奥妙。其中有标准版、Plus版和Plus+版,分别对应面向过程、粗糙的面向对象、和具有封装特性的面向对象。