重温经典《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大原则里的里氏替换原则,先记住,以后再回味这一个点。

目录
相关文章
|
15天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
19天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
39 17
|
18天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
27天前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
23 6
|
1月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
18 3
|
18天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
15 0
|
29天前
|
存储 前端开发 Java
你还没有对象吗?java带你创建一个吧
你还没有对象吗?java带你创建一个吧
11 0
|
6天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
2天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
15 9
|
5天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####