该系列文章是在读《Java编程思想》时的读书笔记。
一只菜鸟,如文章中有错误,还请指出,非常感谢。
欢迎相互交流。
-- QyQiaoo
文章列表
1. 抽象过程
- 所有编程语言都提供抽象机制。可以认为人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。其中“类型”是指“所抽象的是什么?”
语言 | 抽象 |
---|---|
汇编语言 | 汇编语言是对底层机器的轻微抽象 |
FORTRAN / BASIC / C (“命令”式语言) | 这些语言都是对汇编语言的抽象 |
- 程序员必须建立起在机器模型(位于“解空间”内,对问题建模的地方)和实际待解决问题的模型(位于“问题空间”,这是问题存在的地方)之间的关联;
- 在面向对象的方式中,我们将问题空间中的元素及其在解空间中的表示称之为“对象”,这种思想的实质是:程序可以通过添加新类型的对象使自身用于某个特定问题;
- OOP允许根据问题来描述问题。而不是根据运行解决方案的计算机来描述问题;面向对象程序设计的挑战之一,及时在问题空间的元素和解空间的对象之间创建一对一的映射;
- Booch对对象提出了一个更加简洁的陈述:对象具有状态、行为和标识;
2. 每个对象都有一个接口
- 每个对象都只能满足某些请求,这些请求由对象的接口(Interface)所定义;
-
接口确定了对某一特定对象所发出的请求,如下图所示,类型/类名称为Light,可以向Light对象发出的请求是:打开 它、关闭它、将它调亮、将它调暗。
3. 每个对象都提供服务
- 当试图开发或者理解一个程序设计时,最好的方法之一就是将对象想象为“服务提供者”;
将对象看作是服务提供者还有一个附带的好处:提高对象的内聚信性,高内聚性是软件设计的基本质量要求之一。
4. 被隐藏的具体实现
- 访问控制存在原因:一、让程序员无法触及他们不该触及的部分;二、允许类库设计者改变类的内部结构而不用担心影响使用该类的程序员;
- 访问控制有四种,如下所示:
访问控制字符 | |
---|---|
public | 任何人都可以用 |
private | 除类型创建者和类型内部方法外的任何人都不能访问 |
protected | 除类型创建者和类型的内部方法及继承的类外的任何人都不能访问 |
default | 同包中的类可以访问(包的访问权限) |
5. 复用具体实现
- 最简单的复用某个类的方式就是直接使用该类的对象;
- 复用也可以是将类的一个对象置于某个新类中,我们称其为“创建了一个成员对象”,(使用现有类合成新的类称之为组合(composition)),如果是动态发生则称之为聚合(aggregation),组合经常被视为“has-a(拥有)”关系。如:我们常说“汽车拥有引擎”,可用如下UML图表示:
- 注:组合带来了极大的灵活性。新类的成员对象通常都被声明为private,使得使用新类的客户端程序员不能访问他们,这也可用使得你在不干扰现有客户端代码的情况下,修改这些成员,也可以在运行时修改这些成员对象,以实现动态修改程序的行为,而继承不具备这样的灵活性,因为编译器必须通过继承而创建的类事假编译时的限制。
6. 继承
-
通过继承我们可以实现以现有类为基础,复制它并发添加修改这个副本来创建新类,但当父类发生变动时,子类也会反映出这些变动,UML类图如下所示:
父类包含了所有子类所共有的特性。
父类和子类有着相同的基础接口,所以伴随着此接口必定有某些方法的具体实现。有两种方法可以使父类与子类产生差异:一、在子类中添加新方法;二、改变现有父类的方法,这被称之为覆盖(Overridding)那个方法
若子类中没有添加新的方法,此时可以称子类完全替代一个基类对象,可以被视为纯粹替代,这种关系被称为is-a(是一个)关系;若添加了新的方法可以称为is-like-a(像是一个)关系。
7. 伴随多态的可互换对象
- 在处理类型的层次结构时,经常想把一个对象对象不当作他所属的特定类型来对待,而是将其作为基类的对象来对待,这使得人们可以编写不依赖特定类型的代码。
- 在Java中采用了后期绑定的概念解决了程序直至运行时才能确定代码的地址的问题;为了执行后期绑定,Java使用了一小段特殊的代码来替代绝对地址调用,这段代码使用在对象中储存的信息来计算方法体的地址。
- 将子类看为父类的过程称为 向上转型(upcasting)
8. 单根继承结构
- 单根继承结构保证了所有对象都具有某些功能,因此在系统中可以在每个对象上执行某些基本的操作,并且所有的对象都可以很容易的在对上创建,参数传递也得到了极大的简化,并且单根集成结构也使的垃圾回收器的实现变得容易很多。