第一章 对象导论

来源:互联网 发布:戴维南定理实验数据 编辑:程序博客网 时间:2024/06/17 08:51

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

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

OOP (Object-oriented Programming,OOP) 面向对象。

所有编程都提供抽象机制,可以认为,人们能够解决的问题的复杂性直接取决于抽象的类型和质量。

所谓的“类型”是指“所抽象的是什么?”。

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

“命令式语言”都是对汇编语言的抽象。

命令语言的弱点:它们所作的主要抽象仍要求在解决问题时要基于计算机的机构,而不是基于所要解决的问题的结构来考虑。

程序员必须要建立起在解决问题模型(位于“解空间”内,这是你对问题建模的 地方)和实际待解决问题的模型之间的 关联。

面向对象将问题空间中的元素以及在解空间中的表示成为”对象“。

一个成功的面向对象语言的五个基本特征。这些特征表现了一种纯粹的面向对象程序设计方式。

1.万物皆对象
2.程序是对象的集合,它们通过发送消息来告知彼此所要做的.
3.每个对象都有自己的由其他对象所构成的存储。
4.每个对象都拥有其类型。”每个对象都是某个类的实例”
5.某一特定类型的所有对象都可以接受同样的消息。

1.2 每个对象都有一个接口
类描述了具有相同特性(数据元素)和行为(功能)的对象集合。
面向对象程序设计的挑战之一,就是在问题空间的元素和解空间的对象之间创建一对一的映射。
接口去定了对某一特定对象所能发出的请求。

1.3 每个对象都提供服务

高内聚 是每个程序设计的基本质量要求之一

1.4 被隐藏的具体实现

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

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

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

类创建者可以任意修改被隐藏的部分,而不用担心对其他任何人造成影响,被隐藏的部分通常代表对象内部脆弱的 部分。

访问控制存在的第一个原因就是让客户端程序员无法触及他们不应该触及的部分—这些部分对数据类型的内部操作来说是必须的,但并不是用户解决特定问题所需接口的一部分。

访问控制存在的第二个原因就是允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员。

Java 用了三个关键字在类的内部设定边界:public private protected.
public表示紧随其后的元素对任何人都是可用的,
private这个关键字表示出了类型创建者和类型的内部方法之外的任何人都不能访问的元素。private 就像你和客户端程序员之间的一堵墙。
protected关键字与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。

Java 还有一种默认的访问权限,当没有使用面前提到的任何访问指定词时,它们将发挥作用,这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(构件库)中的其他的成员,但是在包之外,这些成员如同指定了private一样。

1.5 复用具体实现
代码的复用性是面向对象可以被程序设计语言所提供的最了不起的优点之一。

1.6继承
类组成了编程语言中的最基本单位。
一个基类包含了所有导出类型共享的特性和行为,可以创建一个基类型来表示系统中某些对象的核心概念,从基类型中导出其他类型,来表示此核心可以被实现的不同方式。

当继承了现有的类型也就是创建了新的类型,这个新的类型不仅包括现有的类型的所有成员(尽管private成员变量被隐藏了起来,并且不能被访问),而且更重要的是它复制了基类的接口。

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

由于基类和导出类具有相同的基础接口,所以伴随此接口的必定有某些具体实现。

有两种方法可以使基类与导出类产生差异。第一种是直接在导出类中添加新方法。这些新方法并不是基类接口数据的一部分。这就意味着基类不能满足你所有的需求,因此必须添加更多的方法。

第二种使导出类和基类之间产生差异的方法是改变现有的基类的方法的行为,被称之为覆盖。“此时,我正在使用相同的接口方法,但是我想在新类型中做些不同的事情”。

1.6.1“是一个”和“像一个”的关系
用一个导出类的对象来完全替代一个基类对象,这种视为“纯粹替代”

1.7伴随交互的可互换对象

编译器不可能产生传统意义上的函数调用。一个 非面向对象编。程的编译器产生的函数调用会引起所谓的前期绑定。

1.8 单根继承结构
单继承结构的终极基类的类的名字是object。

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

单根继承结构保证所有对象都具备某些功能。使垃圾回收 器的实现变得容易多了。

1.9 容器
第一,不同容器提供了不同类型的接口和外部行为。堆栈相比于队列就具备不同的接口行为,也不同于集合和列表的接口和行为。
第二,不同的容器对于不同的操作有不同的效率,
object可以存储任何的东西。
可以通过对象置于堆栈或静态存储区域内来实现。这种方式将存储空间分配和释放置于优先考虑的位置,在某些情况下这样的控制非常有价值,但是也牺牲了灵活性,因为必须在编写程序时知道对象的切确数量、生命周期和类型。

第二种方法是在都成为堆的内存池中动态的创建对象。这种方法,直到运行时才知道需要多少对象,它们的生命周期如何,以及它们的具体类型是什么。

Java 完全采用了动态内存分配方式。每当想要创建新对象时,它们就要使用new关键字来构建此对象的动态实例。

异常是一种对象,它从错误的地点被“抛出”,并被专门设计用来处理特定类型错误的相应的异常处理器“捕获”。

异常处理就像是与程序正常执行路径并行的,在错误发生时的执行的另一条路径。因为它是另一个完全分离的执行路径。

1.2并发
通常,线程只是一种为单一处理器分配执行时间的手段。

共享资源,多行并发任务都要访问同一项资源,那么就会出现问题。解决的问题的方法是:
某个任务锁定某项资源,完成其任务,然后释放资源锁,使其他资源可以访问使用这项资源。

原创粉丝点击