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

目录
相关文章
|
5天前
|
安全 Java 编译器
java中类与对象回顾总结-2
java中类与对象回顾总结
14 3
|
5天前
|
Java 编译器
java中类与对象回顾总结-1
java中类与对象回顾总结
14 3
|
1天前
|
Java 编译器
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
9 4
|
2天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
17 4
|
4天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
5天前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
5天前
|
Java
从源码出发:JAVA中对象的比较
从源码出发:JAVA中对象的比较
19 3
|
1天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第13天】在计算机科学中,多线程是一种使得程序可以同时执行多个任务的技术。在Java语言中,多线程的实现主要依赖于java.lang.Thread类和java.lang.Runnable接口。本文将深入探讨Java中的多线程编程,包括其基本概念、实现方法以及一些常见的问题和解决方案。
|
1天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第13天】 在Java开发中,并发编程是一个复杂且重要的领域。它不仅关系到程序的线程安全性,也直接影响到系统的性能表现。本文将探讨Java并发编程的核心概念,包括线程同步机制、锁优化技术以及如何平衡线程安全和性能。通过分析具体案例,我们将提供实用的编程技巧和最佳实践,帮助开发者在确保线程安全的同时,提升应用性能。
10 1
|
2天前
|
Java 调度
Java一分钟之线程池:ExecutorService与Future
【5月更文挑战第12天】Java并发编程中,`ExecutorService`和`Future`是关键组件,简化多线程并提供异步执行能力。`ExecutorService`是线程池接口,用于提交任务到线程池,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。通过`submit()`提交任务并返回`Future`对象,可检查任务状态、获取结果或取消任务。注意处理`ExecutionException`和避免无限等待。实战示例展示了如何异步执行任务并获取结果。理解这些概念对提升并发性能至关重要。
17 5