【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才是技术。

相关推荐
李拾叁的摸鱼日常2 分钟前
Redis 实现仓储单据异步提交技术方案
java·后端
步步为营DotNet9 分钟前
深入理解IAsyncEnumerable:异步迭代的底层实现与应用优化
java·服务器·数据库
qq_4798754311 分钟前
protobuf[1]
java·开发语言
装不满的克莱因瓶14 分钟前
【Java架构 搭建环境篇三】Linux安装Git详细教程
java·linux·运维·服务器·git·架构·centos
运维@小兵17 分钟前
使用Spring-ai实现同步响应和流式响应
java·人工智能·spring-ai·ai流式响应
CoderYanger18 分钟前
A.每日一题——3432. 统计元素和差值为偶数的分区方案
java·数据结构·算法·leetcode·1024程序员节
Geoking.19 分钟前
JDK 版本与 Java 版本的关系
java·开发语言
huohuopro22 分钟前
java基础深度学习 #1
java·开发语言·java基础
Zaralike34 分钟前
Java设计模式
java·开发语言·设计模式
一 乐1 小时前
智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序