【Java编程思想读书笔记】第一章:对象导论

epeppanda
发布于 2021-2-5 09:22
浏览
0收藏

参考书目:《Java编程思想》(第四版)

 

阅读《Java编程思想》(第四版)一书收获颇多,之所以想通过用博客记笔记的方式来读书,是因为这样可以倒逼自己仔细、反复地阅读书中的知识,找相对意义上的重点,并且由于人脑更适合输出型的学习,通过将内容边看、边记、边理解和边打字写文,相比直接反复阅读更有效益(当然这本书后续仍需反复阅读几十遍甚至百遍以上都不为过),而另一个原因就是这样也能够在阅读中通过博客来记录自己的学习历程,博客记录的不只是图文,它们记录的正是自己的成长,等以后毕业或者工作后,回首大学四年,多少有点可以回念的东西,还可以说一句:一路走来,我读了很多前辈们的好书,对技术充满了热情,永远在不断学习的路上。

 

start.作者讲授思路:【Java编程思想读书笔记】第一章:对象导论-鸿蒙开发者社区

1.面向对象程序设计(Object-oriented Programming,OOP)。

 

2.需解决的问题的复杂性直接取决于抽象的类型和质量。

 

3.汇编语言是对底层机器的轻微抽象;”命令式“语言是对汇编语言的抽象,但是此类语言所做的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来考虑。

 

4.OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。

 

5.Alan Kay总结了第一个成功的面向对象语言、同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了一种纯粹的面向对象程序设计方式。
(1)万物皆为对象
(2)程序是对象的集合,它们通过发送消息来告知彼此要做的
(3)每个对象都有自己的由其他对象所构成的存储
(4)每个对象都拥有其类型
(5)某一特定类型的所有对象都可以接收同样的消息

 

6.Booch对对象提出了一个更简洁的描述:对象具有状态、行为和标识。

 

7.类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所有一个类实际上就是一个数据类型。

 

8.程序员可以根据需求通过定义新的类来适应问题,即通过添加新的数据类型来扩展编程语言,编程系统欣然接收新的类,并且像对待内置类一样地照管它们和进行类型检查。

 

9.UML(Unified Modelling Language,统一建模语言)形式的图:每个类都由一个方框表示,类名在方框顶部,数据成员在方框中间部分,方法在方块底部。通常,只有类名和公共方法被示于UML设计图中。如果只对类型感兴趣,那么方块底部也不需要给出。

 

10.当年试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为”服务提供者”。程序本身将向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。你的目标就是去创建(或者最好在现有代码库中寻找)能够提供理想的服务来解决问题的一系列对象。

 

11.将对象看作服务提供者,有助于提供对象的内聚性。高内聚时软件设计的基本质量要求之一:意味着一个软件构件的各方面“组合”得很好。

 

12.在良好的面向对象设计中,每个对象都可以很好地完成一项任务,但是它并不试图做更多的事。

 

13.程序开发人员按照角色分为:类创建者(那些创建新数据类型的程序员)和客户端程序员(那些在其应用中使用数据类型的类消费者)。

 

14.类创建者的目标是构建类,这种类只向客户端程序员暴露必须的部分,而隐藏其他部分,被隐藏的部分通常代表对象内部脆弱的部分,它们很容易被粗心或不知内情的客户端程序员所毁坏,隐藏实现隐藏起来可以减少程序bug;客户端程序员的目标是收集各种用来实现快速应用开发的类。

 

15.访问控制的第一个原因就是让客户端程序员无法触及他们不应该触及的部分;第二个原因就是允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员。

 

16.最简单的复用某个类的方式就是直接使用该类的一个对象,如果将其置于某个新的类中,则称为在此类中创建了一个成员对象,这种概念被称为 “组合”(has-a关系),如果组合是动态发生的,则被称为“聚合”。

 

17.继承如果只覆盖了基类的方法,则意味着导出类(也称为继承类或子类)和基类(也成为源类、超类或父类)是完全相同的类型,因为它们有完全相同的接口,可用一个导出类对象来完全替代一个基类对象,这被视为纯粹替代,通常称为替代原则,基类与导出类的关系为**(is-a关系)。导出类中如果添加了新方法**,则为**(is-like-a关系)**,导出类扩展了接口,虽然新类型仍可替代基类,但这种替代并不完美,因为基类无法访问新添加的方法。

 

18.把一个对象不当作它所属的特定类型来对待,而是将其当作基类的对象来对待,这使得人们可以编写出不依赖特定类型的代码,且易于扩展,这种操作称为泛化。

 

19.一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址;在OOP中,采用后期绑定,编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的语言称为弱类型语言),但是并不知道要被执行的确切代码,程序直到运行时才能确定代码的地址。为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用,这段代码使用在对象中存储的信息来计算方法体的自制。

 

20.Java是单根继承结构,所有类都继承自Object类,单根继承保证所有对象都具备某些功能,例如,所有对象可以很容易地在堆上创建,被垃圾回收器回收。

 

21.C++则无法确保所有对象都属于同一个基本类型,从向后兼容的角度看,这能更好地适应C模型,而且受限少,但在引用新类库时,需要解决兼容问题(有可能要通过多重继承)。

 

22.Java中,容器类型持有对其中对象的引用,可以随时扩充容器。容器有多种类型,如List(用来存储序列),Map(也成为关联数组,用来建立对象之间的关联),Set(每种对象类型只持有一个),以及队列、树、堆栈等构件。

 

23.ArrayList和LinkedList可以理解为对象的动态数组和链表,二者的存取特点和插入删除类似数组与链表,当不确定用哪一种时,可用二者的接口List,将容器之间进行转换时对代码的影响降低到最小。

 

24.容器+单根继承结构意味着存储Object类型的容器可存储任何类型,当向此种容器中置入对象时,对象引用被置入,且被向上转型为Object,当把它取回时,获取了一个Object对象的引用,因此需向下转型为其原本类型。

 

25.向上转型是安全的;向下转型是不安全的,而解决方案为Java中的泛型。

 

26.Java在被称为堆的内存池中动态地创建对象,直到运行时(运行相关代码那一刻)才知道需要多少对象,它们的生命周期如何,以及具体类型是什么。如果需要一个新对象,可以在需要的时候在堆中创建,因为存储空间在运行时被动态管理,所有需要大量时间在堆中分配存储空间;C++则将对象置于对战或静态存储区域内来实现,对象的存储空间和声明周期可以在编写程序时确定,在堆栈中创建存储空间和释放存储空间通常各需一条汇编指令即可,分别对应将栈顶指针向下移动和向上移动。前者效率相对较低(程序较复杂时此开销将微乎其微)但方便,后者效率高但需要频繁考虑内存泄漏问题。

 
end.名词科普(来自百度百科):

 

(1)LISP语言(LISP,List Processing的缩写):创始时间为1958年,是一种早期开发的、具有重大意义的自由软件项目。它适用于符号处理、自动推理、硬件描述和超大规模集成电路设计等。特点是,使用表结构来表达非数值计算问题,实现技术简单。LISP语言已成为最有影响,使用十分广泛的人工智能语言。

 

(2)Prolog(Programming in logic):是一种面向演绎推理的逻辑型程序设计语言,最早于1972年由柯尔麦伦纳(Colmeraner)及其研究小组在法国马赛大学提出。

 

(3)Smalltalk:Smalltalk语言仍被认为是最具有代表性和运用最广泛的面向对象程序设计语言。Smalltalk语言的前身叫做Flex系统,最早是由Alan Kay提出的,

Smalltalk简单易学,使用方便,因为它的句法和语义比较简单,并且涉及的概念不多。对象、类、消息和方法等少数几个概念就构成Smalltalk的编程基础。

 

(4)Booch:Booch方法是早期面向对象的软件开发方法的一种,Booch认为软件开发是一个螺旋上升的过程,每个周期包括4个步骤,分别是标识类和对象、确定类和对象的含义、标识关系、说明每个类的接口和实现。Booch方法的开发模型包括静态模型和动态模型,静态模型分为逻辑模型(类图、对象图)和物理模型(模块图、进程图),描述了系统的构成和结构。动态模型包括状态图和时序图。

 

(5)内聚性(Cohesion):也称为内聚力,是一软件度量,是指机能相关的程序组合成一模块的程度,或是各机能凝聚的状态或程度。是结构化分析的重要概念之一。量测内聚性的方式很多,有些方法是由分析源代码,得到非量化的结果,有些方法则是检查源代码的文本特征,以得到内聚性的量化分数。内聚性是属于顺序式的量测量,一般会以“高内聚性”或“低内聚性”来表示。一般会希望程序的模块有高内聚性,因为高内聚性一般和许多理想的软件特性有关,包括鲁棒性、可靠度、可复用性及易懂性(understandability)等特性,而低内聚性一般也代表不易维护、不易测试、不易复用以及难以理解。

 

(6)鲁棒是Robust的音译,也就是健壮和强壮的意思。它也是在异常和危险情况下系统生存的能力。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。所谓“鲁棒性”,也是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。根据对性能的不同定义,可分为稳定鲁棒性和性能鲁棒性。

分类
已于2021-2-5 09:22:02修改
收藏
回复
举报
回复
    相关推荐