读TIJ -1 对象入门

《Thinking In Java·第 1 章对象入门》

第 1 章约20页,是对面向对象的程序设计(OOP)的一个综述。按照其前言所述:“其中包括对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。这一章会向大家提出一些对象创建的基本问题,比如构建器、对象存在于何处、创建好后把它们置于什么地方以及魔术般的垃圾收集器(能够清除不再需要的对象)。要介绍的另一些问题还包括通过违例实现的错误控制机制、反应灵敏的用户界面的多线程处理以及连网和因特网等等。大家也会从中了解到是什么使得Java 如此特别,它为什么取得了这么大的成功,以及与面向对象的分析与设计有关的问题。”

整体上看,1.OOP的各种概念大致介绍一下;2.对象的生命周期问题;3.另一些问题。

【面向对象编程(OOP)具有多方面的吸引力。……】事实上,他的意思是面向对象技术或面向对象编程范式的好处,涵盖OOA、OOD等。

【思考对象的时候,需要采用形象思维,而不是程序化的思维。……】在《编程导论·1.1.3 面向对象》中,使用 隐喻、符合人们日常生活中的一些处事习惯、我服务故我在、客户与服务器等,强调"面向对象技术基本愿望:希望在软件开发中,问题域的建模和解域的构建能够符合人类在日常生活中养成的思考习惯、生活习惯。程序员能够按照自己的日常生活经验进行软件开发"。

1.1 抽象的进步/演化

翻译我就不吐槽了,这一段最好不要看中文版的。刚才我下了TIJ3rd

这一段写得相当的唬人,如果说TIJ偏重于介绍面向对象的“思想”,我看这一段比较像!而且因为本节是1.1,读者会以为后面会展开,事实上,TIJ嘎然而止。有人说,学习面向对象技术的第一个词,就应该是抽象,同意。但是,什么是抽象?

【p93 抽象发生在编程的各个方面,大致上分为功能抽象(functional/process abstraction)数据抽象(data abstraction) ,以及对象抽象(object abstraction)。】所以,《编程导论》第3章功能抽象、第4章数据抽象。

单纯讨论抽象,在1.1.1 问题域和解域中。

图 1-1 问题域和解域中的对象

【p24

图1-1简略的表达了问题域和解域之间的关系。其中两次地使用了抽象(abstract)这一词汇。

抽象既用作一个过程/活动,也用作一个结果/实体。

作为活动(动词),抽象意味着从一个或一组事实、数据、现象中提取(v. extract/ abstract)主要的细节而忽略非主要的细节。抽象是人类应对/控制复杂性的常用技术。例如对一群dogs加以抽象,按照需求可能仅关心狗的名字、年龄等,而忽略其出生地、外貌特征、饮食习惯等。最典型的例子是牛顿物理学中的质点,不考虑物体本身的形状和大小,把质量看作集中在一点上;再例如几何中的点、线、三角形等等。简言之,抽象即简化或理想化。形象地说,抽象就是舍得——有舍才有得。

作为(理论)实体(名词),抽象意味着从许多具有相同性质的、重复出现的事实/数据/现象中获得的类别性的概念、规律性的结论、数学公式、模型等表达形式。最基础的例子就是概念/名词,类是具体物体的抽象。再如,通过归纳或提炼(或证明),可以将程序的各种各样的语句抽象成三种基本流程结构。

所以,在说道“抽象、继承、多态”时,这个抽象和类、概念、名词是近义词。

【Alan Kay 总结了Smalltalk 的五大基本特征】我不太在意这五大基本特征,但是我在图1-5艾伦?凯 面向对象之父(之一)前的★,和1.1标题中,强调了他的名言:计算就是模拟。

【这一特性称为对象的“可替换性”,是OOP 最重要的概念之一。】嗯,赞同。我把LSP作为面向对象的三大基石,2.1.1 里氏替换原则、2.1.4 访问修饰符与继承·3. 继承的分类,以及继承多态都围绕LSP。不知道TIJ在后面会不会展开。

1.2 对象的接口(An object has an interface)

【有些人进行了进一步的区分,他们强调“类型”决定了接口,而“类”是那个接口的一种特殊实现方式】。这个“接口”,我在4.1数据抽象的含义·4.1.2 类的接口中称为类的接口。【p133 类的接口指外界对象能够访问的、类所定义的接口的集合。使用访问修饰符限定类的接口,这一机制称为封装,在[第6章封装]中详细介绍。

绝大多数情况下,可以视class为一种type。例如,在[2.2.2Java数据类型]中所给出的(数据)类型的概念,将类作为类类型。

在[2.1.1里氏替换原则]中介绍了子类(subclass)与子类型(subtype)的区别,那么,类(class)和类型(type) 又有什么差异呢?

差异表现在接口与实现的分离上。type是一个名称,它标识了类的接口。如果一个对象能够接受X类的接口的全部操作请求(方法调用),则称对象具有X类型。正是因为Java的子类能够满足父类的接口(尽管可以改写),所以子类的对象能够同时具有类层次中的多个类型

类(class)则是接口和实现的综合体。类不仅仅定义了一种类型,也定义了对象的内部状态和方法的实现,以及不是接口的方法(如private方法)。简言之,类型是类的接口,类是类型+实现。】。

1.3 实现方案的隐藏The hidden implementation

本节介绍封装和信息隐藏。

1.4 方案的重复使用Reusing the implementation

实现/代码的复用。翻译啊。

【Code reuse is one of the greatest advantages that object-oriented programming languages provide. 】。这是我超级不赞同的观点。

1、代码的复用是巨大的优点,但是不是面向对象带来的,C的函数库就有这一巨大的优点;如果按照合成复用优先原则,面向对象和面向过程在此没有差别;

2、【p62 实现继承(implementation inheritance),或者说以父类的代码复用为目的的继承,这是许多对象技术的初学者感觉对象技术强大的第一印象。】而且,专门用一节 4.2.3 接口继承 Vs. 实现继承,【p137本节详述实现继承(特化继承)存在的问题,以强调接口继承(协议继承)和抽象方法的重要性】。

1.5 继承:重新使用接口

中文的,老子看不下去了。

Is-a vs. is-like-a relationships 这一小节写得非常烂。严重怀疑他懂不懂LSP。他说的“继承只能override基类的函数”是特化继承/实现继承(implementation inheritance),而后者是扩展(extension)继承,两者都完美的满足替换原则。总体上,他仍然将继承视为代码上具有的关系,应该从类层次的角度看问题。

子类(特化继承和扩展继承)都“是一个”父类。扩展继承向上造型/替换时,不过是“子类扩展的丧失”。子类完全满足父类的接口是关键。【p63 对子类扩展丧失最恰当的解说,是“白马非马”。白马替代马之后,它只能够是马而非白马,白马丧失了自己的特色,不能再将白马作为白马——“白马非白马”,除非向下造型(回来)】

1.6 多形对象的互换使用 Interchangeable objects with polymorphism

读TIJ -1 对象入门

时间: 2024-10-14 07:33:44

读TIJ -1 对象入门的相关文章

读TIJ -6 类再生

<Think in java·第 6 章类再生> 读TIJ -1 对象入门 中已经就代码复用性吐槽了.继承关系在结果上(不是为了代码复用而设计继承关系)为代码复用提供了新的途径. 本章看其目录就比较杂,程序员的内聚思想去哪儿了?合成复用优先--合成.继承,为什么实现继承是不好的-- 6.1 合成的语法 解释了一个例程,没有什么好说的.has_a关系. 6.2 继承的语法 [You can think of inheritance, then, as reusing the class.]Is_

1.JAVA 编程思想——对象入门

对象入门 欢迎转载,转载请标明出处:    http://blog.csdn.net/notbaron/article/details/51040219 如果学JAVA,没有读透<JAVA 编程思想>这本书,实在不好意思和别人说自己学过JAVA.鉴于此,蛤蟆忙里偷闲,偷偷翻看这本传说中的牛书. 面向对象编程OOP具有多方面吸引力.实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.已于维护的设计方案. 这些描述看上去非常吸引人的,不过蛤蟆还是没啥印象(至少到

java基础 第一章 对象入门

第1章 对象入门 "为什么面向对象的编程会在软件开发领域造成如此震憾的影响?" 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此. 如果说它有缺点,那就是掌握它需付出的代价.思考对象的时候,需要采用形象思维,而不是程序化的思维.与程序化设

读TIJ -3 控制程序流程

<Think in java·第 3 章控制程序流程> 这一章应该不会涉及"思想",<编程导论(Java)·0.2.2 操作符和操作数>后,将相关内容压缩成一节<第3章功能抽象·3.2实现>. 3.1 使用Java 运算符 副作用(side effect):[p98:副作用一般是针对操作(表达式)而言的,一个操作/表达式有"副作用"是指在对该表达式求值时,会改变程序的一个或多个数据,以致再次对该表达式求值时,可能会得出不同的结果.

读TIJ -4 初始化和清除

<Think in java·第 4 章初始化和清除> 本章介绍对象的创建和消除. 4.1 用构建器自动初始化 [You can imagine creating a method called initialize( ) for every class you write.]一句话的正确解读是,你(男生)将自己想象成为女生.所以,我专门用一节 < 编程导论(Java)·2.3.6 构造器不是方法>强调这一点. 4.2 方法过载 这一段解释非常经典,按照人们的日常生活介绍重载.同时

JS搞基指南----延迟对象入门提高资料整理

原文:JS搞基指南----延迟对象入门提高资料整理 JavaScript的Deferred是比较高大上的东西,  主要的应用还是主ajax的应用,  因为JS和nodeJS这几年的普及,  前端的代码越来越多,  各种回调套回调再套回调实在太让人崩溃, 所以就从后端拖了一个延迟对象这货, 用来解决回调地狱这个问题 .  我们使用ajax的时候多数都是为ajax添加回调 ,然后异步向服务器发送请求, 比如如下原生的XHR代码: <!DOCTYPE html PUBLIC "-//W3C//D

读TIJ -7 多形性

<Think in java·第 7 章  多形性> [面向对象的程序设计语言三种最基本的特征:数据抽象.继承和多态] 在这个层面是没有什么"思想"好谈的!当你按照人们熟悉的.习惯的思维方式,去思考"构造和组织"程序时,你可能会觉得很自然--你具有面向对象的思想:或者,有人X按照人们熟悉的.习惯的(人的而非机器的)思维方式,给你介绍.解释数据抽象.继承和多态时,你觉得贴近生活和人的思考习惯.你觉得他讲的概念理所当然.自然(当然也浅显易懂),这是X在&qu

读TIJ -5 隐藏实施过程

<Think in java·第 5 章隐藏实施过程> 从第一句话,就感觉本章会令我不满意."将发生变化的东西与保持不变的东西分隔开"与封装一毛钱的关系都没有.封装变化又称OCP,与OOP的封装性无关. 关于库(中的类A)的设计,依赖库的程序B,要求库是向下兼容的.程序B依赖的是A的接口.库的创建者不管想怎样自由地进行修改与改进,前提是不修改A的接口. 这里,A的接口,表示A需要提供的服务,设计者不可能.也不会考虑该服务(的方法名.参数)未来是否保持不变或改变. 所以,JD

读TIJ -2 一切都是对象

<第2 章一切都是对象> 1.一切都是对象.不是Bruce Eckel说的,而是Alan Kay 总结的Smalltalk 五大基本特征的第一条. 从程序设计者或源码的角度,我觉得:"一切皆对象.X" .类型type是计算机科学重要概念(类型理论type theory),从对象技术角度看,Java源码中没有不论什么对象,一切皆类型.引用变量或引用,只有没有对象.为了模拟自然(无论唯心或唯物),我杜撰了 柏拉图法则:类的世界独立存在,对象世界由类创建而来 2.杂合语言或多范式