读TIJ -1 对象入门

本文概述了面向对象编程的核心概念,包括抽象、接口、实现的隐藏、代码复用、继承和多态。探讨了如何通过抽象简化复杂性,对象的接口与实现的分离,以及如何通过继承和多态实现代码的复用和灵活性。
摘要由CSDN通过智能技术生成

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

第 1 章约20页,是对面向对象的程序设计(OOP)的一个综述。按照其前言所述:

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


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

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


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

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

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

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


基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值