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

第 1 章约20页,是对面向对象的程序设计(OOP)的一个综述。

依照其前言所述:

“当中包含对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及很重要的多形性的概念。这一章会向大家提出一些对象创建的基本问题,比方构建器、对象存在于何处、创建好后把它们置于什么地方以及魔术般的垃圾收集器(可以清除不再须要的对象)。要介绍的还有一些问题还包含通过违例实现的错误控制机制、反应灵敏的用户界面的多线程处理以及连网和因特网等等。

大家也会从中了解到是什么使得Java 如此特别,它为什么取得了这么大的成功。以及与面向对象的分析与设计有关的问题。

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

注:【】中是该书的摘录。而【page xx 】是《编程导论》的相关摘录。


【面向对象编程(OOP)具有多方面的吸引力。

……】其实,他的意思是讲 面向对象技术或面向对象编程范式的优点而非OOP,涵盖OOA、OOD等。

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

程序猿可以依照自己的日常生活经验进行软件开发"。而该书这里一带而过,主要说明库的事情。

1.1 抽象的进步/演化

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

1.【全部编程语言的终于目的都是提供一种“抽象”方法。....】本节稍对问题域和解域的映射加以介绍,而面向对象技术,正如上面已经说明的:问题域的建模和解域的构建...

有人说,学习面向对象技术的第一个词,就应该是抽象。允许。

可是。什么是抽象?

这一段写得相当的唬人,假设说TIJ偏重于介绍面向对象的“思想”。我看这一段比較像!并且由于本节是1.1,读者会以为后面会展开,其实。TIJ嘎然而止。

【《编程导论(Java)》p93 抽象发生在编程的各个方面,大致上分为功能抽象(functional/process abstraction)数据抽象(data abstraction) ,以及对象抽象(object abstraction)。】所以,《编程导论(Java)》中编写了第3章功能抽象、第4章数据抽象。假设单纯讨论抽象,在《编程导论(Java)》1.1.1
问题域和解域
中。

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

【《编程导论(Java)》p24

图1-1简略的表达了问题域和解域之间的关系。

当中两次地使用了抽象(abstract)这一词汇。

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

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

简言之,抽象即简化或理想化。形象地说。抽象就是舍得——有舍才有得。

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

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

2.【Alan Kay 总结了Smalltalk 的五大基本特征……】我不太在意这五大基本特征,并且也不喜欢tij在五大基本特征的附加说明。

可是,在《编程导论》图1-5艾伦•凯 面向对象之父(之中的一个)前的★,和1.1标题中,强调了凯的名言:计算就是模拟。

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

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

1.【亚里士多德也许是认真研究“类型”概念的第一人……】事实上。亚里士多德是唯物的,而他的老师柏拉图(Plato)的理念论,正好适用于软件的解域。

2.【有些人进行了进一步的区分,他们强调“类型”决定了接口。而“类”是那个接口的一种特殊实现方式】。这个“接口”。我在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 继承:又一次使用接口

中文的,老子看不下去了。
1.5.2 Is-a vs. is-like-a relationships 这一小节写得很烂。严重怀疑他懂不懂LSP。他说的“This can be thought of as pure
substitution and it’s often referred to as the substitution principle. ”,事实上不过指特化继承/实现继承(implementation
inheritance),而他所说的is-like-a 其实是指扩展(extension)继承。而其实。两者都完美的满足替换原则
整体上,他仍然将继承视为代码上具有的关系,其实我们应该从类层次的角度看问题。
子类(包含特化继承和扩展继承)都“是一个”父类——这里没有所谓的is-like-a 。扩展继承向上造型/替换时,只是须要注意“子类扩展的丧失”。

子类全然满足父类的接口是关键。

【p63 对子类扩展丧失最恰当的讲解。是“白马非马”。白马替代马之后。它仅仅可以是马而非白马,白马丧失了自己的特色,不能再将白马作为白马——“白马非白马”,除非向下造型(回来)】


is-like-a 关系,通经常使用于说明多继承环境中,子类型与多个父类型的关系。



差评。

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

不想看了。反正后面会讲。


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

  1. 读匿名object对象的属性值

    读匿名object对象的属性值 1.定义读object对象值的功能方法 public static class StaticClass { public static string ValueByKe ...

  2. 读TIJ -2 一切都是对象

    <第2 章一切都是对象> 1.一切都是对象.不是Bruce Eckel说的,而是Alan Kay 总结的Smalltalk 五大基本特征的第一条. 从程序设计者或源码的角度,我觉得:&qu ...

  3. java 对象入门

    对象的五大特征 (1)所有东西都是对象.可将对象想象成一种新型变量;它保存着数据,但可要求对自身进行操作.理论上讲, 可从要解决的问题身上提出所有概念性的组件,然后再程序中将其表达为一个对象. (2) ...

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

    JavaScript的Deferred是比较高大上的东西,  主要的应用还是主ajax的应用,  因为JS和nodeJS这几年的普及,  前端的代码越来越多,  各种回调套回调再套回调实在太让人崩溃, ...

  5. 《day06---面向对象入门》

    /* java开发流程:思路. 案例:对数组操作.获取最大值. 思路: 1,一组数,要获取最大值,比较. 2,怎么比较?挨个比较,要获取数组中的每一个数据都要比较. 3,比较完,记录下来比较大的数据, ...

  6. JavaScript对象入门指南

    前言 不少开发对JavaScript实现面向对象编程存在一知半解,并且不少的在项目实践中写的都是面向过程编程的代码,因此,希望能从零入手介绍面向对象的一些概念到实现简单的面向对象的例子让大家包括我自己 ...

  7. Week03-面向对象入门

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 类 对象 封装 继承 覆盖 重载 构造函数 static public private toString f ...

  8. 201621123068 Week03-面向对象入门

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...

  9. 作业03-面向对象入门.md

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...

随机推荐

  1. HierarchyView的实现原理和Android设备无法使用HierarchyView的解决方法

    声明:由于本人一直用eng版的真机调试,所以此方法没有用过,记录在这里,有机会验证 ---------------------------------------------------------- ...

  2. 【读书笔记】【CLR via C#】【第一章】The CLR’s Execution Model

    内容提要 本章的目的是对.Net 框架的设计做一个总体的介绍,包括介绍框架中使用的一些技术.定义一些术语.同时会展示从源代码生成应用程序(或者一些包含了一些自定义类型的可以发布的组件),并且会解释程序 ...

  3. Android Studio HelloWorld

    开发第一应用 可以开发属于自己的应用,是否有点小激动?好吧!让我们开始,首先点击Start a new Android Studio Project创建工程: 接下来需要输入应用名称(第一个字母要大写 ...

  4. 在Docker下部署Nginx

    在Docker下部署Nginx 在Docker下部署Nginx,包括: 部署一个最简单的Nginx,可以通过80端口访问默认的网站 设置记录访问和错误日志的路径 设置静态网站的路径 通过proxy_p ...

  5. CentOS 6.0 图文安装教程

    CentOS 6.0下载地址:wget http://ftp.riken.jp/Linux/centos/6.0/isos/i386/CentOS-6.0-i386-bin-DVD.iso 下边就是安 ...

  6. X/Open DTP——分布式事务模型

    转载:http://www.cnblogs.com/aigongsi/archive/2012/10/11/2718313.html 这一几天一直在回顾事务相关的知识,也准备把以前了解皮毛的知识进行一 ...

  7. 4d tensor

    偶然在一个ppt中看到了如下关于tensor的解释,清晰明白,所以post在这里,以备后续查看 根据这个理解: theano中的input(4d tensor):[mini-batch size, n ...

  8. C#事件(Event)学习日记

    event 关键字的来由,为了简化自定义方法的构建来为委托调用列表增加和删除方法. 在编译器处理 event 关键字的时候,它会自动提供注册和注销方法以及任何必要的委托类型成员变量. 这些委托成员变量 ...

  9. ios7新特性2--多任务提升

    iOS 7 为应用程序提供新的后台执行模式: 应用程序需要需要下载新内容,可以向系统注册,这样程序会被定期唤起或者启动,然后可以在后台下载内容.要注册这个功能,需要打开Info.plist 文件,设置 ...

  10. 【转】ByteBuffer 到底怎么用?网络编程中一点总结!--不错

    原文网址:http://cuisuqiang.iteye.com/blog/1443212 做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读 ...