Thinking In Java 第一章

中文名称:Java编程思想

第一章 理解对象

编程就是对问题空间和解空间的映射,面向对象方式(oject oriented approach)就是将问题空间中的元素及其在解空间中的表达称为“对象”。

思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定问题。也就是说,通过添加某个class的object,而这些object有特性和操作,使得这个程序有能力解决某个问题。每个对象都属于定义了特性和行为的某个类


Java的五个基本特性:

1. 万物皆为对象 

2. 程序是对象的集合,他们彼此通过发送消息来调用对方。发送消息就是调用方法

3. 每个对象都拥有由其他对象所构成的存储

4. 每个对象都拥有其类型type。对象就是某个类的一个实例。类型type在这里指的是class

5. 某一特定类型的所有对象都可以接收同样的信息。同一个class有相同的方法


将对象看做服务提供者service provider。程序的目的是去创建可以提供理想服务来解决问题的对象集合。目的是创建对象集合来解决问题。这个问题需要提供什么服务?这些服务需要哪些对象?


将开发人员分为类创建者和类使用者。类只向使用者暴露必要的部分,隐藏具体实现。如果接口和实现跨越清晰的分离和保护,对类内部的改变就不会影响到类的使用者,因此访问控制是重要的。三个关键词设定了类的边界:public(所有人可访问),private(仅类的创建者和类的内部方法可访问),protected(在private的基础上,允许继承者访问),default(同一个包内,都可访问)


最简单的方式就是直接使用该类的一个对象,也就是创建一个成员对象,比如说,车有引擎,是has-a的关系

class car{
    private engine e1;
}

这个概念称为“组合”composition。如果组合是动态发生,称为“聚合”aggregation


对象作为工具,将数据和功能封装到一起。

继承出现的原因:当出现两个有相似功能的类A,B时,继承关系让我们只用创建类A,让类B继承A,并对A进行修改添加。

类不仅描述了作用于对象集合的约束条件,还有它和其他类的关系。基类包含了所有导出类共有的特性和行为,因此程序中的基类表现了某些对象的核心概念。

导出类继承了基类的接口。对于具体的实现,基类和导出类的差异是,1. 导出类添加了功能 2. 改变基类的方法 overriding

这两种差异就导致继承可能是is-a关系,也可能是is-like-a关系

is-a关系也就是基类和导出类拥有完全一样的接口,只重载overriding,没有添加新的接口

is-like-a也就是导出类添加了新的功能,如图,heat pump就是导出类,添加了heat功能。基类无法访问新添加的方法。

Thinking In Java 第一章


在处理类的结构时,我们不要关注对象的特定类型,而是要泛化,将对象看成它的基类的对象,就可以编写不被特定类型影响的代码,比如写喜鹊,先把它当做鸟类,它的特性和行为归纳为基类。当创建喜鹊类时,就不需要修改鸟类的方法,降低了代码的维护成本。

在非面向对象中,编译器对于函数调用是“前期绑定”的,当编译器要对该函数调用,linker会解析到被执行的代码的地址。

在面向对象中,程序只有在运行时刻才确定代码的地址,因此需要“后期绑定”来确保被调用的方法存在,也会对调用参数和返回值进行类型检查,但是并不知道具体的代码。这种动态绑定也叫“多态”。

如下代码,编译期间只对dosth的参数和返回值进行检查,不会解析到具体代码的地址,不知道是去circle的draw方法,还是基类shape的draw方法。由于 Circle 可以被 doStuff() 看作是 Shape,也就是说,doStuff()可以发送给 Shape 的任何消息,Circle 都可以接收。我们吧将导出类看做他的基类的过程称作向上转型(upcasting)

void dosth(shape s){
    s.draw();
}
circle c = new circle();
line l = new line();
dosth(c);
dosth(l);

 

 

 

黑色部分是原文翻译,紫色部分是自己的总结

上一篇:body标签中可用标签-超文本标签


下一篇:在Ecilpse中集成Vim-like编辑器vrapper