Thinking in Java 自学笔记——第一章 对象导论

第一章 对象导论

/*

*本笔记,是我直接从word中copy过来,没有怎么排版,见谅!

*/

目录

第一章 对象导论...1

1.1抽象过程...1

1.2 每个对象都有一个接口...2

1.3 每个对象都提供服务...2

1.4 被隐藏的具体实现...2

1.5 复用具体实现...2

1.6 继承...3

1.7 伴随多态的可互换对象...3

1.8 单根继承结构...3

1.9 容器...4

1.10 对象的创建和生命期...4

1.11 异常处理:处理错误...4

1.12 并发编程...4

“我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来……除非赞成这个协定中规定的有关语言信息的组织和分类,否则我们根本无法交谈。”

                                                                                             ——BenjaminLee Whorf(1897 ~ 1941)

计算机革命起源于机器,因此,编程语言的产生也始于对机器的模仿。

但是,计算机并非只是机器那么简单(头脑延伸的工具、不同类型的表达媒体)。面向对象程序设计(Object-oriented Programming, OOP)便是这种以计算机作为表达媒体的大趋势中的组成部分。

/*

*个人见解:计算机就是一个机器而已。(似乎怎么解释都不好说,不妨你把你面前的计算机*搞搞举起,然后狠狠地砸下去,你就明白了。)

*/

1.1抽象过程

所有编程语言都提供抽象机制。-->人们所能解决的问题的复杂性直接取决于抽象的类型和质量。

汇编语言:对底层机器的轻微抽象。

“命令式”语言(FORTRAN、BASIC、C……):对汇编语言的抽象。

---------------------------他们所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于索要解决问题的结构来考虑。

程序猿必须建立起在机器模型(位于“解空间”内,这是你对问题建模的地方,例如计算机)和实际待解问题的模型(位于“问题空间”内,这是问题存在的地方,例如一项业务)之间的关联。-------->副产物:“编程方法”

另一种对机器建模的方式就是只针对待解问题建模。如LISP和APL,都考虑世界的某些特定视图。一旦超出其特定领域,就力不从心了。

面向对象方式通过向程序猿提供表示问题空间中的元素的工具而更近了一步。我们将问题空间中的元素及其在解空间中的表示称为“对象”。这种思想的实质:程序可以通过添加新类型的对象使自身适用于某个特定问题。

第一个成功的面向对象语言、同时也是Java所基于的语言之一的Smalltalk的五个基本特性:

1)万物皆对象。

2)程序是对象的集合,他们通过发送消息来告知彼此所要做的。

3)每个对象都有自己的由其他对象所构成的存储。

4)每个对象都拥有其类型。

5)某一特定类型的所有对象都可以接受同样的消息。

对对象的一个更加简洁的描述:对象具有状态、行为和标识-------->每一个对象在内存中都有一个唯一的地址。

1.2 每个对象都有一个接口

银行出纳员问题。

创建抽象数据类型(类)是面向对象程序设计的基本概念之一。

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

任何程序都是你所设计的系统的一种仿真,面向对象技术的应用确实可以将大量的问题很容易地降解为一个简单的解决方案。

面向对象程序设计的挑战值一,就是在问题空间的元素和解空间的对象之间创建一对一的映射。

接口确定了对某一特定对象所能发出的请求。但是,程序中必须有满足这些请求的代码。这些代码与隐藏的数据一起构成了实现。

1.3 每个对象都提供服务

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

将对象看作是服务提供者还有一个附带的好处:它有助于提高对象的内聚性。高内聚是软件设计的基本质量要求之一。

将对象作为服务提供者看待是一件伟大的简化工具。

1.4 被隐藏的具体实现

将程序开发人员按照角色分为类创建者(那些创建新数据类型的程序猿)和客户端程序猿(那些在其应用中使用数据类型的类消费者)是大有裨益的。

客户端程序猿的目标:收集各种用来实现快速开发的类。

类创建者的目标:构建类,这种类只向客户端程序猿暴露必需的部分,而隐藏其他部分。

没有访问控制,所有东西都将赤裸裸地暴露于世人面前。

访问控制的原因:

一:让客户端程序猿无法触及他们不应该触及的部分。

二:允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序猿。

1.5 复用具体实现

代码复用是面向对象程序设计语言所提供的最了不起的优点之一。

组合:使用现有的类合成新的类。----->“has-a”(拥有)关系

 
 
 

(汽车拥有引擎)

组合带来了极大的灵活性。

由于继承在面向对象程序设计中如此重要,所以它经常被高调强调,于是程序猿新手就会有这样的印象:处处都应该使用继承。这会导致难以使用并过分复杂的设计。实际上,在建立新类时,应该首先考虑组合,因为它更加简单灵活。如果采用这种方式,设计会变得更加清晰。一旦有了一些经验之后,便能够看出必须使用继承的场合了。

1.6 继承

 
 
 

继承:以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新类。

对使用面向对象设计的人们来说,困难之一是从开始到结束过于简单。对于训练有素、善于寻找复杂的解决方案的头脑来说,可能会一开始被这种简单性给难倒。

由于通过发送给类的消息的类型可知类的类型,所以这也意味着导出类与基类具有相同的类型。

通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。

使基类和导出类产生差异的两种方法:

一:直接在导出类中添加新方法(应该仔细考虑是否存在基类也需要这些额外方法的可能性)。----->is-like-a(像是一个)

二:改变现有基类的方法的行为(更重要的方法)。------->is-a(是一个)纯碎代替

1.7 伴随多态的可互换对象

前期绑定:非面向对象编程的编译器产生的函数调用。

后期绑定:面向对象设计语言使用的。

转型----->向上转型

一个面向对象程序肯定会在某处包含向上转型,因为这正是将自己从必须知道确切类型中解放出来的关键。

1.8 单根继承结构

在OOP中,所有的类都继承自单一的基类-----Object。事实证明,单根继承结构带来了很多好处。

在单根继承结构中的所有对象都具有一个公共接口,所以它们归根到底都是相同的基本类型。

单根继承结构使垃圾回收器的实现变得容易得多。

1.9 容器

List Map Set

从设计的观点看,真正需要的只是一个可以被操作,从而解决问题的序列。

在Java SE5出现之前,勇气存储的对象都只具有Java中的通用类型:Object。单根继承结构意味着所有东西都是Object类型,所以可以存储Object的容器可以存储任何东西。这使得容器很容易被复用。要使用这样的容器,只需在其中置入对象引用,稍后还可以将它们取回。但是由于容器只存储Object,所以当将对象引用置入容器时,它必须被向上转型为Object,因此它会丢失其身份,当把它取回时,就获取了一个对Object对象的引用,而不是对置入时的那个类型的对象的引用。所以,要用到向下转型,然而,向上转型是安全的,向下转型却是不安全的,为了解决这种不安全,从而引出了参数化类型机制。

1.10 对象的创建和生命期

对象的数据位于何处?

一:(C++)将对象置于堆栈。------>灵活性不足:必须在编写程序时知道对象确切的数量、声明周期和类型。

二:在堆的内存池中动态地创建对象。

Java完全采用了动态内存分配方式。

对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以销毁它。然而,如果是在堆上创建对象,编译器就会对它的生命周期一无所知。

垃圾回收机制避免暗藏的内存泄漏问题。

1.11 异常处理:处理错误

Java的异常处理在众多的编程语言中格外引人注目,因为Java一开始就内置了异常处理,而且强制你必须使用它。

注意:异常处理不是面向对象的特征。

1.12 并发编程

隐患:共享资源。

原创文章 27 获赞 18 访问量 3万+

猜你喜欢

转载自blog.csdn.net/b635781894/article/details/24963489