第一章 对象导论
1.1 抽象过程
1. 程序可以通过添加新类型的对象使自身适用于某个特定问题。
2. 万物皆可对象:对象可存储数据、可在自身执行操作;
程序是对象的集合,他们通过发送消息(方法调用请求)来告知彼此所要做的;
每个对象都有自己的由其他对象所构成的存储,即 可以通过创建包含现有对象的包的方式来创 建新类型的对象;
每个对象都拥有其类型;
某一特定类型的所有对象都可以接收同样的消息(有同样的方法)
3. 对象具有状态(由对象内部数据反映)、行为(方法)、标识(每一个对象在内存中都有唯一的地址)。
1.2 每个对象都有一个接口
1. 类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型。
2. 接口确定了对某一特定对象所能发出的请求(该对象的方法)。
1.3 每个对象都提供服务
1. 当正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为 “服务提供者”,程序通过调用其他对象提供的服务来向用户提供服务。
2. 在良好的面向对象设计中,每个对象都可以很好的完成一项任务,但它并不试图做更多事。
1.4 被隐藏的具体实现
Java 用三个关键字在类的内部设定边界:
public: 修饰的元素任何人可用
private: 修饰 只有类型创建者和类型的内部方法可访问 的元素
protected: 与 private 的区别仅在于 继承的类可以访问 protected 的成员,但不能访问private的成员。
1.5 复用具体实现
1. 最简单的复用某个类的方式就是 直接使用该类的一个对象。
此外也可以将那个类的一个对象置于某个新的类中(创建一个成员对象)。这叫做“组合”,是一种“has-a(拥有)”关系,例如“汽车拥有引擎”,如果组合是动态发生的,就被称为“聚合”。新类的成员对象通常被声明为private,使得使用新类的客户端程序员不能访问它们。
2. 建立新类时,比起使用继承,应该优先考虑使用更为简单灵活的“组合”。
1.6 继承
1. 当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(其中private成员被隐藏了起来,并且不可访问),还复制了基类的接口(方法)。
2. 有两种方法可以使基类与导出类产生差异:
- 直接在导出类中添加新方法
- 改变现有基类的方法的行为(覆盖 overriding),即 在导出类中重新定义该方法。
1.6.1 “是一个” 与 “像是一个” 关系
is-a : 只覆盖基类的方法
is-like-a : 添加了新的接口元素
1.7 伴随多态的可互换对象
多态:把一个对象不当做它所属的特定类型来对待,而是将其当做基类的对象来对待。
例如 批量处理 继承于同一个基类的多个导出类对象“们” 时,会想要使用多态。这些对象在调用同一方法时各自执行不同的代码。
靠什么实现:面向对象程序设计语言的方法具备的后期绑定属性(对Java而言是默认行为)。
1.8 单根继承结构
Java 中所有类都是 Object 的子类, 这使得 在堆上创建对象、垃圾回收等的操作更加方便(所有类型的对象都被当作Object)。
1.9 容器
很多对象的大小只有运行时才能获得,这时就创建了一种新的对象类型---容器(集合) 来记录对这些对象的引用。
1.9.1 参数化类型
1. 向上转型(把导出类看做基类)是安全的,向下转型几乎是不安全的。
2. 安全起见,容器的使用引入参数化类型(即 泛型)——编译器可以自动定制作用于特定类型上的类。
1.10 对象的创建和生命周期
1. 对象占用资源,特别是内存,
2. C++ 讲究效率,由程序员在编写程序时确定对象的存储空间和生命周期,可通过将对象置于堆栈或静态存储区域来实现。
3. Java 则完全采用了动态内存分配方式,在堆(heep)中动态地创建对象,直到运行时才知道需要多少对象、对象的生命周期以及对象的具体类型,因此堆中存储空间的管理分配时间也增加了,但动态方式下编程的灵活性也更大。
4. Java 优于 C++ 的几个点:垃圾回收机制、Object单继承、只在堆上创建对象。
1.11 异常处理:处理错误
1. 异常是一种对象,它从出错点被抛出,被相应的异常处理器“捕获”。
2. 异常处理就像是与程序正常执行路径并行的、在错误发生时执行的另一条路径。
3. 异常不能被忽略,他保证一定会在某处得到处理。
4. 异常提供了一种从错误状况进行可靠恢复的途径。
1.12 并发编程
1. 通常,线程只是一种为单一处理器分配执行时间的手段,但如果操作系统支持多处理器,那么每个任务都可以被指派给不同的处理器,并且他们是在真正地并行执行。
2. 隐患:共享资源。
1.13 Java 与 Internet
Java 解决了在万维网(WWW)上的程序设计问题。
1.13.1 Web 是什么
1. 客户/服务器计算技术:
服务器:信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群。
服务器所服务的客户机有若干个。
2. 其中一个很重要的性能问题是 延迟,有时会使用中间件将负载分散给在服务器端的其他机器(中间件也被用来提高可维护性)。
3. Web 就是一个巨型的客户/服务器系统。
4. Web浏览器使得一段信息不经修改就可以在任意型号的计算机上显示。
5. 浏览器只是一个观察器,因为它甚至不能执行最简单的计算任务。
1.13.2 客户端编程
1. 客户端编程意味着Web浏览器能用来执行任何它可以完成的工作,使得返回给用户的结果更加迅捷,网站更具交互性。
2. 客户端编程与传统编程的不同之处在于平台。
3. 关于插件、脚本语言(例如JavaScript)略。
4. Java 通过 applet 以及使用 Java Web Start 来进行客户端编程。applet 是在Web浏览器中运行的小程序,它提供一种分发软件的方法,一旦用户需要客户端软件,applet 就从服务器把客户端软件分发给用户。
5. 备选方案: Macromedia 的 Flex,允许创建基于 Flash 的、与 applet 相当的应用。
6. .NET 和 C#
.NET 平台大致相当于Java虚拟机和Java类库,C# 和 Java 有类似之处。
7. Internet 与 Intranet
当Web技术仅限用于特定公司的信息网络时,它就被成为Intranet(企业内部网)
1.13.3 服务端编程
部分Web服务器是基于Java的,它使得我们可以 用Java编写被称为 servlet 的程序 来实现服务器端编程。