《数据结构与抽象:Java语言描述(原书第4版)》一P.1 封装

简介:

本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第1章 ,第1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 罗得岛大学  新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

P.1 封装

如果你想学习驾驶,那么对汽车的哪些描述对你最有用?显然不是描述它的发动机如何周而复始地获取空气和汽油,点燃空气和汽油的混合物,然后排出的过程。当你想学习驾驶时,这样的细节是不必要的。事实上,可以以你的方式获知这些细节。如果你想学习驾驶,最有用的汽车描述是如下的这些特点:

  • 如果你将脚踩在油门踏板上,汽车将开得更快。
  • 如果你将脚踩在制动踏板上,汽车将慢下来并最终停止。
  • 如果你将方向盘向右转,汽车将右转。
  • 如果你将方向盘向左转,汽车将左转。

就像你不需要告诉想开车的人发动机是如何工作的一样,你也不需要告诉使用一款软件的人Java实现的全部细节。同样,假定你为另一个程序员写了一个用在程序中的软件组件,你应该告诉其他的程序员如何使用它,而不是与程序员分享如何写软件的细节。
封装(encapsulation)是面向对象程序设计的设计原则之一。“封装”这个词听上去好像是把东西放进胶囊,这个想象确实是正确的。封装隐藏了“胶囊”里的细节。由于这个原
因,封装常常称为信息隐藏(information hiding)。但不是所有的事情都应该隐藏。在汽车里,有些东西是可见的(如踏板和方向盘),而其他的则藏在引擎盖下面。换句话说,汽车是封装的,这样隐藏了细节,只有驾车所需的控制是可见的,如图P-1所示。类似地,你应该封装Java代码,让细节隐藏,而只有必需的控制是可见的。
封装将数据和方法放在一个类中,而隐藏了使用类时不需要的实现细节。如果类的设计良好,使用它就不需要理解它的实现。程序员可以在不知道代码细节的情况下使用类的方法。程序员只需知道如何为方法提供相应的参数,让方法执行正确的动作。简单地说,程序员不必担心类定义的内部细节。使用封装软件写更大软件的程序员,他的任务更简单。因此,软件生产得更快,错误也更少。

注:封装是面向对象程序设计的设计原则之一,它将数据和方法放在一个类中,故而隐藏了类实现的细节。程序员仅需要知道使用这个类的信息就足够了。设计良好的类,即使看不到每个方法的方法体,也可以使用它们。


image


图P-1 汽车的控制对司机是可见的,但它的内部工作机理是隐藏的
抽象(abstraction)是一个要求你关注什么而不是如何的过程。当设计类时,执行数据抽象(data abstraction)。你关注想做的或关注数据,而不担心如何完成这些任务及如何表示数据。抽象要求你将注意力集中于重要的数据和操作。当抽象某件事时,你要确定中心思想。例如,书的抽象就是书的简介,与之相对的是整本书。
当设计一个类时,不应该考虑任何方法的实现。即,不应该担心类的方法如何实现它的目标。将规格说明与实现分开,能让你专心于更少的细节,所以能让你的工作更容易,出错概率更低。详细的、设计良好的规格说明,有助于让实现更易成功。

注:抽象的过程要求你关注“什么”而不是“如何”。

正确的封装将类定义分为两部分,我们称为客户接口(client interface)和实现(implementation)。客户接口描述程序员使用这个类时必须了解的一切事情。它包括类的公有方法的方法头,告诉程序员如何使用这些公有方法的注释,以及类中公有定义的任何常量。类定义的客户接口部分应该是在你的程序中使用这个类时要了解的全部。
实现部分由所有的数据域及所有方法的定义组成,包括公有、私有及保护的方法。虽然运行客户(使用类的程序)时需要这个实现,但写客户时不需要知道实现细节。图P-2说明了一个类的封装实现及客户接口。虽然实现对客户是隐藏的,但接口却是可见的,且为客户提供了与实现进行交互的规范机制。
客户接口和实现在Java类的定义中是不分开的,它们合在一起。不过你可以随同你的类创建一个独立的Java接口。本序言后半部分介绍如何写这样的接口,本书中还会再写几个。

image

自测题1 客户接口如何区别于类的实现?
自测题2 用一个不同于汽车的例子说明封装。例子中的哪些部分对应于客户接口,哪些部分对应于实现?

相关文章
|
4月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
6月前
|
Java 数据库连接 数据库
Java 组件详细使用方法与封装实战指南
本指南详解Java核心组件使用与封装技巧,涵盖跨平台开发、面向对象编程、多线程、数据库操作等关键内容,并提供工具类、连接池、异常及响应结果的封装方法。结合Spring框架、MyBatis、Spring Boot等主流技术,助你掌握高质量Java组件设计与开发实践。
217 2
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
282 18
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
124 4
|
8月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
309 5
|
3月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
198 15
|
5月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
291 14
|
4月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
451 0

热门文章

最新文章