【JavaSE】面向对象——封装性

封装性是什么?

所谓封装,就是先把客观事物封装成抽象概念的类,将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

通俗的说,封装就是先把事物聚集到一起,再用一个外壳将其包装。对外,用户可以操作,但是不知道内部具体的操作细节,这就是封装。

本质上也就是把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装的设计思想。

为什么需要封装性?

在生活中,人人都要使用洗衣机,使用者只需要按下开关和洗涤模式即可,具体洗衣机内部的结构根本没有必要了解。同样,年满18岁之后都要学会开车,驾驶员根本不知道离合、油门及刹车的原理,但依旧可以开的很好。在客观世界中,每一个事物的内部信息都隐藏在其内部,外部无法直接操作和修改,只能通过指定的方式进行操作。这就是封装性的体现,试想一下,如果人人都要学会操作内部才可以使用机器,那么人类社会的发展将是无比缓慢的。对比到我们的系统中:

随着系统的日渐复杂,类会越来越多,如果不将其封装起来,那么可能操作一个类的同时,其他无数个类会被影响到,这将会是非常可怕的影响。但是,我们如果把握好类之间的访问边界,这样不仅设计成本降低,操作成本也大大降低。这也符合了面向对象的设计原则:高内聚、低耦合。

高内聚、低耦合是软件工程中的概念,也是UNIX操作系统设计的经典原则。

内聚:指一个模块内各个元素彼此结合的紧密程序。

耦合:指一个软件结构中不同模块之间相互连接程度的度量。

内聚意味着重用和独立;耦合意味着多米诺效应,牵一发而动全身。

而高内聚、低耦合的体现之一:

高内聚:类的内部操作和细节自己完成,不允许外部干涉。

低耦合:仅保留少量的方法给外部使用。

如何实现封装性?

根据封装性的概念可知,封装性就是把该隐藏的隐藏,该暴露的暴露。也就是说,需要控制类内部成员的权限,即根据权限的不同,不同的外部也会看到不同的成员。

由上可得,实现封装性就需要依赖访问控制修饰符,也称为权限修饰符。

权限修饰符

private、确省、protected、public。

|-----------|------|-----|--------|---------|
| 权限修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包的非子类 |
| private | √ | | | |
| 确省 | √ | √ | | |
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |

注意

  1. 对类的内部成员来说,四种权限修饰符都可以使用。

  2. 对外部类来说,只有public以及确省可以使用。

  3. 对外部类来说,四种权限修饰符都可以使用。

封装性的体现

场景一:私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改。

场景二:将类中不需要对外暴露的方法,设置为private。

场景三:单例模式中构造器private,避免在类的外部创建实例。

总结

所谓封装性,就是先将事物化作成抽象概念的类,再将数据与操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅暴露供外部使用的方法。通俗的讲,就是暴露该暴露的,隐藏该隐藏的。万事万物都有存在的意义,而对于封装性来说,就是因为系统的复杂,类越来越多,这就需要把握好类与类之间的边界,这就是封装存在的概念,用较为官方的语言来说,就是"高内聚、低耦合"。有了封装性,也有了为啥要存在封装性,那最后肯定就是怎么来实现封装性了。在Java中,体现封装性的方法就是使用权限修饰符来控制类内部成员的可见范围。上述大致就是我理解的封装性的内容,封装性相对来说是一种思想,而不是一种实现手段,权限修饰符才是实现方法,就好比Spring中的IoC和DI一样,IoC只是思想,DI才是技术。

相关推荐
【JAVA】玩家36 分钟前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
MandalaO_O2 小时前
IDEA 开发(快捷键 + 调试 + 序列化)
java·ide·intellij-idea
xiaoqiMikko3 小时前
JVM 线上排查实战(七):jps 看不见它、jstack 连不上它,可它明明活得好好的
java·jvm
狼爷3 小时前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
念何架构之路3 小时前
zap扩展生态与总结
java·前端·数据库
第七页独白4 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
QCoding4 小时前
Spring AI Alibaba Graph实战:从ReAct Agent到Workflow,企业AI复杂流程该如何编排?
java·人工智能
用户094248568034 小时前
第25章:Java虚拟线程(Project Loom)实战与调度协作
java·jvm
砚底藏山河4 小时前
量化实战:截面因子有效性检验(IC 分析与分层回测)
java·python·金融·maven