重温经典《Thinking in java》第四版之第一章 对象导论(五)

简介: 重温经典《Thinking in java》第四版之第一章 对象导论(五)

1.4 被隐藏的具体实现这一小节讲到了一个访问控制权限的问题,讨论这个问题之前,首先将类,也就是我们的抽象按照角色划分为类创建者和类使用者。类的创建者向类使用者暴露哪些部分,隐藏哪些部分,这是很重要的事情。

一个类的被隐藏的部分为什么要被隐藏?如果需要被隐藏起来而没有隐藏起来会造成什么影响?这其实是程序或者我们系统健壮性的问题。

 

我认为一个类被隐藏的部分被隐藏起来的原因主要有两个,一个是该部分不该让使用者看到,对他们来讲没有意义或者没有直接目的;第二个就是该被隐藏的部分如果没有被隐藏,被使用者使用了会造成这个类的重大破坏,甚至引起重大的bug。当然类的创建者在修改这部分被隐藏的部分时也要格外的小心,要充分考虑类的使用者使用到的没有被隐藏的部分。

 

下面介绍了Java编程语言使用到三个关键字在类的内部设定边界:public、private、protected还有一种默认的访问权限即没有上面三个关键字的。这一块可以先通过简单了解一下,后面还会详细介绍。

(1)public:可以被所有其他类所访问。

 

(2)private:只能被自己访问和修改。

 

(3)protected:自身,子类及同一个包中类可以访问。

 

(4)default(默认):同一包中的类可以访问,声明时没有加修饰符

 

下面就到了1.5 复用具体实现这一小节了,这一节讲的是代码复用问题。要让一个类的代码在任何通用的场合都能不做任何修改的情况下被使用是一件了不起的事情。当然通过不断的迭代使其达到这种效果也是了不起的事情。

 

书中举了一个汽车和引擎的关系的例子同时引入了组合的概念来说明复用的问题。这里面同时还引出了继承,也就是1.6 继承这一小节要将的内容。组合常被视为has-a拥有的关系,继承被视为is-a是一个的关系。比如汽车拥有一个引擎,那么汽车和引擎的关系就是组合,引擎作为汽车的一部分,具有高度的复用性,而且驾驶员是操作汽车,不会去操作引擎的,这一点说明引擎在汽车里属于私有的。而1.6 继承这一小节给出的继承的例子也是比较常见的图形的关系。

image.png

圆形、方形和三角形都是一种几何形,这一点说明是继承的关系,不能是组合的关系,不能说图形拥有圆形,这一点从语义上说不通。继承关系的话,就像上面UML图表示的那样,Circle继承下来的draw方法和其他两个Square、Triangle继承下来的draw方法的实现肯定都是互相不一样的,从形状的数学几何表示上就可以看出来。在继承关系中Shape称为基类或超类或父类,Circle、Square、Triangle称为导出类或继承类或子类。这些概念可以先记住,都是一样的,想要根深蒂固需要不断的写代码实践才行。

 

上面说到了Circle、Square、Triangle继承了Shape中的draw方法的实现肯定都是互相不一样的,这就是子类对基类的方法行为的覆盖。当然子类中还会有自己的新的方法,也可以选择不使用基类中的方法,这点说明基类对子类是不可控的,子类有更大的灵活性去做自己的事情。这又引出了该小节中的另一个问题,就是是一个像是一个关系的问题。简单的理解吧,如果Circle从Shape继承下来的所有属性和行为都满足自己的需求而不添加新的元素(属性和方法),那么就说Circle是一个Shape,是is-a的关系。用文中另一个例子说明像是一个的关系。

image.png

Air Conditioner空调是一种Cooling System制冷系统,Heat Pump热力泵也是一种制冷系统,这个热力泵就is-like-a空调。这里面的像是一个的关系不是子类和基类的关系,而是子类之间有一种像的关系。当然就像书中说的,制冷系统这个基类不够一般化,所以才会有is-like-a这种关系。制冷系统代替不了热力泵,因为制冷系统不包含制热功能。就不能套用替代原则,这里的替代原则就是面向对象7大原则里的里氏替换原则,先记住,以后再回味这一个点。

目录
相关文章
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
31 6
|
2月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
29 3
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
43 0
|
2月前
|
存储 前端开发 Java
你还没有对象吗?java带你创建一个吧
你还没有对象吗?java带你创建一个吧
14 0
|
5天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
35 6
|
20天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
18天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####