【阅读笔记】Thinking in Java 对象入门

阅读书籍

《Thinking in Java》

第一章 对象入门

怎么理解面向对象(OOP)? 答:面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。在我理解,万物皆对象。

理解面向对象

面向对象 :封装、继承、多态性 所有编程语言的最终目的都是提供一种“抽象”的方法 OOP 能允许我们根据问题来描述问题,而不是根据方案。 针对第一门面向对象语言Smalltalk总结出的面向对象对的五大基本特征:

  1. 万物皆为对象。
  2. 程序是对象的集合,他们通过发送消息来告知彼此所要做的。
  3. 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。
  4. 每个对象都有一种类型,每个对象都是某个“类”的一个“实例”。一个类最重要的特征就是“能将什么消息发给它?”
  5. 同一类所有对象都能接收相同的消息。

类和接口

class (type)

所有对象,尽管各有特色,都属于某一系列对象的一部分,这些对象具有通用的特征和行为。 注:在面向对象的程序设计中,尽管我们真正要做的是新建各种各样的数据“类型”(Type),但几乎所有面向对象的程序设计语言都采用了“class”关键字。当您看到“type”这个字的时候,请同时想到“class”;反之亦然。 有些人进行了进一步的区分,他们强调“类型”决定了接口,而“类”是那个接口的一种特殊实现方 式

接口

我们向对象发出的请求是通过它的“接口”(Interface)定义的,对象的“类型”或“类”则规定了它的接口形式。“类 型”与“接口”的等价或对应关系是面向对象程序设计的基础。

组织

为重复使用一个类,最简单的办法是仅直接使用那个类的对象。但同时也能将那个类的一个对象置入一个新类。我们把这叫作“创建一个成员对象”。新类可由任意数量和类型的其他对象构成。无论如何,只要新类达到了设计要求即可。这个概念叫作“组织”——在现有类的基础上组织一个新类。有时,我们也将组织称作“包含”关系,比如“一辆车包含了一个变速箱”。

继承

能利用现成的数据类型,对其进行“克隆”,再根据情况进行添加和修改。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。在继承过程中,若原始类(正式名称叫作基础类、超类或父类)发生了变化,修改过的“克隆”类(正式名称叫作继承类或者子 类)也会反映出这种变化。在Java 语言中,继承是通过 extends关键字实现的

多态

多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合自身的方式去响应共同的消息。多态性增强了软件的灵活性和重用性 以实现多态的方法叫作“动态绑定”。编译器和运行期系统会负责对所有细节的控制;我们只需知道会发生什么事情,而且更重要的是,如何利用它帮助自己设计程序。

抽象

设计程序时,我们经常都希望基础类只为自己的衍生类提供一个接口。也就是说,我们不想其他任何人实际创建基础类的一个对象,只对Upcasting(上溯造型)成它,以便使用它们的接口。为达到这个目的,需要把那个类变成“抽象”的——使用abstract 关键字。若有人试图创建抽象类的一个对象,编译器就会阻止他们。这种工具可有效强制实行一种特殊的设计。亦可用abstract 关键字描述一个尚未实现的方法,作为一个“根”使用

“Upcasting”(上溯造型) : 把衍生类型当作它的基本类型处理的过程叫作“Upcasting”(上溯造型)。其中,“cast”(造 型)是指根据一个现成的模型创建;而“Up”(向上)表明继承的方向是从“上面”来的——即基础类位于顶部,而衍生类在下方展开。所以,根据基础类进行造型就是一个从上面继承的过程,即“Upcasting”。在面向对象的程序里,通常都要用到上溯造型技术。

对象的创建和存在时间

创建

为获得最快的运行速度,存储以及存在时间可在编写程序时决定,只需将对象放置在堆栈(有时也叫作自动或定域变量)或者静态存储区域即可

销毁

程序员可用两种方法来破坏一个对象:用程序化的方式决定何时破坏对象,或者利用由运行环境提供的一种“垃圾收集器”特性,自动寻找那些不再使用的对象,并将其清除。 java选择的是后者,C++是前者。

存贮

在面向对象的设计中,大多数问题的解决办法似乎都有些轻率——只是简单地创建另一种类型的对象。用于解决特定问题的新型对象容纳了指向其他对象的句柄。这种新对象通常叫作“集合”。在需要的时候,集合会自动扩充自己,以便适应我们在其中置入的任何东西。所以我们事先不必知道要在一个集合里容下多少东西。只需创建一个集合,以后的工作让它自己负责好了。

面向不同的需求提供了不同类型的集合:其中包括集、队列、散列表、树、堆栈等等,所有集合都提供了相应的读写功能。 添加对象到集合:Add。操作集合对象或比较:Iterator(它属于一种对象,负责选择集合内的元素,并把它们提供给继 承器的用户)

单根结构(单继承)

在Java 中(与其他几乎所有OOP语言一样),所有类最终都应从单独一个基础类继承。,而且这个终级基础类的名字很简单,就是一个“Object”。 优点:

  1. 一个单根结构,加上所有对象都在内存堆中创建,可以极大简化参数的传递
  2. 利用单根结构,我们可以更方便地实现一个垃圾收集器。
  3. 由于运行期的类型信息肯定存在于所有对象中,所以永远不会遇到判断不出一个对象的类型的情况。这对系统级的操作来说显得特别重要,比如违例控制;而且也能在程序设计时获得更大的灵活性。

集合库

集合库由于集合是我们经常都要用到的一种工具,所以一个集合库是十分必要的,它应该可以方便地重复使用。这样一来,我们就可以方便地取用各种集合,将其插入自己的程序。Java 提供了这样的一个库,尽管它在Java1.0和 1.1中都显得非常有限(Java 1.2 的集合库则无疑是一个杰作)。 “下溯造型”(Downcasting):举个例子来说,我 们知道在上溯造型的时候,Circle(圆)属于Shape(几何形状)的一种类型,所以上溯造型是安全的。但我们不知道一个Object 到底是 Circle 还是Shape,所以很难保证下溯造型的安全进行,除非确切地知道自己要操作的是什么。假如下溯造型成错误的东西,会得到我们称为“违例”(Exception)的一种运行期错误

清除异常

在Java 中,垃圾收集器在设计时已考虑到了内存的释放问题(尽管这并不包括清除一个对象涉及到的其他方面)。垃圾收集器“知道”一个对象在什么时候不再使用,然后会自动释放那个对象占据的内存空间。采用这种方式,另外加上所有对象都从单个根类Object 继承的事实,而且由于我们只能在内存堆中以一种方式创建对象,所以Java 的编程要比 C++的编程简单得多。我们只需要作出少量的抉择,即可克服原先存在的大量障碍。

违例控制

“违例控制”将错误控制方案内置到程序设计语言中,有时甚至内建到操作系统内。这里的“违例”(Exception)属于一个特殊的对象,它会从产生错误的地方“扔”或“掷”出来。

多线程

在一个程序中,这些独立运行的片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。

永久性

Java 1.1 提供了对“有限永久性”的支持,这意味着我们可将对象简单地保存到磁盘上,以后任何时间都可取回。之所以称它为“有限”的,是由于我们仍然需要明确发出调用,进行对象的保存和取回工作。这些工作不能自动进行。

阅读感受

读第一遍的时候,由于阅读的是翻译过来的中文文档,有些地方还是有点难理解。第一章主要是的是对象的入门,其中我了解到,在面向对象的编程中,万物皆为对象。他们具有一定的属性也具有一定的操作。所有的对象都是对具体物体的一种抽象。在这些之上,我们渐渐需要形成一种OOP的思想,封装,继承,多态。作者不断的拿C++和Java做对比,让我映像深刻的主要2个区别1.Java是单根结构的,而C++不是,因为这是早期在效率和控制上比较的一种结果,况且C++如果使用了单根结构还要考虑后续的兼容性,而JAVA不需要,因为他是一种全新的语言。2.Java的回收机制是自动处理的。而C++必须手动的处理。因为会产生一定的运行期的开销。还有2个概念上溯造型和下溯造型。java中Exception 是一种特殊的对象,他会被产生错误的地方所throw出。@2019.1.19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值