第一章 对象导论
1.1 抽象过程
- OOP 允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。
- Smalltalk 五个基本特性
- 万物皆为对象
- 程序是对象的集合,它们通过发送信息来告知彼此所要做的。
- 每个对象都有自己的由其他对象所构成的储存。
- 每个对象都拥有其类型
- 某一个特定类型的多有对象都可以接受同样的信息。
- Booch 描述:对象具有状态,行为和标识。
1.2 每个对象都有一个接口
- 类(class)描述了具有相同特性和行为的对象集合,实际上是一个数据类型。
- 程序员通过定义类来适应问题,而不再被迫只能使用现有的同来表示机器的储存单位的数据类型。
- 面对对象程序设计的挑战之一,是在问题空间的元素和解空间的对象之间创建一对一的映射。
- 每个对象都只能满足某些请求,这些请求由对象的接口(interface)所定义。决定接口的便是类型。…此过程被概括为:向某个对象发送信息(产生请求),这个对象便知道此信息的目的,然后执行对应的程序代码。
1.3 每个对象都提供服务
- 将对象想象为“服务提供者”
- 好处之一: 有助于提高对象的内聚性。
- 人们在设计对象所面临的一个问题是,将过多的功能都塞在一个对象中。解决办法:每个对象都只完成一定的任务,并不是试图做更多的事。
1.4 被隐藏的具体实现
- 程序开发人员按照角色分为:类创建者与客户端程序员。
- 类成员的访问控制
- public: 对任何人开放。
- 默认/default:protected+包访问权限,在一个包之中共享访问。
- protected: 同private 加上在继承的类中可以访问。
- private: 仅仅在本类自己的constructor和methods中可访问。
- 访问控制的原因
- 让客户端程序员无法触及他们不应该触及的部分,将实现隐藏起来来减少程序bug。
- 允许库设计者可以改变内部的工作方式而不用担心会影响到客户端成员。
1.5 复用具体实现
- 复用某个类的方式:
- 直接使用某类的一个对象 (create a )
- 将某个类的一个对象至于新的类中,“创建一个成员对象” (has-a relationship)。 这种盖面被称为组合(composition)。
1.6 继承
- 子类继承父类所有的特性与行为,并扩展父类。(1. 覆盖父类的某些方法 overriding,2. 自己创造新的父类没有的方法)。
- 子类的对象也被视为父类的对象。
- “是一个”/ is-a关系:子类只覆盖父类的方法,没有添加新方法。
- “像是一个”/ is-like-a 关系:子类不只覆盖父类的方法,并且添加新方法。
1.7 伴随多态的可互换对象
- 泛型方法操作(generic)
绑定:一个方法的调用与方法所在的类(方法主体)关联起来。
前期绑定: 编译器将产生对一个具体函数名字的调用,运行时将这个调用解析到将要被执行的代码的绝对地址。
Java:final,static,private,构造方法,成员变量(包括静态及非静态)后期绑定:指在运行时根据对象的类型进行绑定,又叫动态绑定或运行时绑定。编译器确保被调用的方法的存在,并对调运参数和返回值进行检查,但是并不知道将被执行的确切代码。程序直到运行时才能够确定代码的地址。
Java:除了前期绑定之外的其他方法属于后期绑定,运行时能判断对象的类型进行绑定
方法与具体类型信息分离(decoupled)的例子:
- Java编译器在编译doSomething()的代码时,并不能确切知道doSomething()要处理的确切类型。
public void doSomething(Shape shale){
shape.drwa();
}
public void main(){
Circle circle = new Circle();
Line line = new Line();
Triangle triangle = new Triangle();
doSomething(circle);
doSomething(line);
doSomething(triangle);
}
向上转型:Upcasting
1.8 单根继承结构
- Java所有类的终极父类:Object
- 单根继承结构:
- 所有对象都具有一个共用接口,保证所有对象都具备某些功能。
- 使垃圾回收器的实现变得容易得多。
1.9 容器
- 如何才能知道需要多少空间来创捷对象?大多是情况是实现无法知道,只有在运行时才能火获得此类信息。
- 容器,也成为集合,在任何需要时都可扩充自己以容纳置于其中的东西。
- 例子:ArrayList, LinkedList, Map, List, Set
- 参数化序列 / 泛型: 在创建容器时便知道所保存的对象的类型,从而不需要事后转型,辨析其可以自动定制与特定类型上的类。
ArrayList<Shape> shapes = new ArrayList<Shape>();
1.10 对象的创建和生命期
- J动态内存分配方式: 在堆(heap)内存池中动态的创建对象。知道运行时才知道需要多少对象,他们的生命周期如何以及他们的具体类型是什么。垃圾回收器会自动发现何时对象不再被使用并摧毁它。
1.11 异常处理,处理错误
- 异常处理将错误直接置于编程语言中。异常是一种对象,它从出错地点被抛出,并被专门设计用来处理特定类型错误的相应异常处理器捕获。提供了一种从错误状况进行科考回复的途径。
1.12 并发编程
1.13 Java与Internet
1.13.1 Web
1.13.2 客户端编程
插件
脚本语言
java (java web start, applet)
备选方案
Internet与intranet
1.13.3 服务器端编程
java servlet
参考文章:
- Java编程思想(Thinking in Java)
- Java之前期绑定,后期绑定,简单理解和实例