第一章 对象导论
1.1 抽象
面向对象提供了更好的问题空间表述工具,元素可以用对象标识。
面向对象的特征:
- 万物皆为对象
- 程序是对象的集合,他们彼此通过发送消息来彼此通信。(阅读程序时的一个很好的角度)
- 每个对象都有其类型
- 某一特定类型的所有对象都可以接收到同样的消息。(继承、多态)
对象拥有状态、行为和标识。
1.2 对象接口
操纵对象的方法。
1.3 每个对象都提供服务
开发、设计或理解程序时,可以将对象看作服务提供者,目标是创建能够解决问题的一系列对象。这样可以提高对象的内聚性。
1.4 被隐藏的实现
隐藏类内隐私、关键或者脆弱的部分,防止被修改以至于出现bug。
主要有四种类型
- private:仅当前类的创建者和内部方法才能访问。
- protected:将访问范文扩大到了继承类。
- public:公开访问。
- 默认:不加访问修饰符,仅在同一个包内可见。
1.5 复用的体现
复用的直接方式使使用该类的一个对象,也可以将类的对象置于新的类中(“组合”)。
1.6 继承
将具有相似功能的类进行归纳总结。例如:形状(三角形、正方形、原型)、垃圾(玻璃、塑料、腐烂物)。
继承的一些问题
- 当继承现有类时,便创建了新的类型,这个戏类型包含所有类型成员,包括private成员但不可访问(这一点对于向上转型很重要,通过向上转型,基类方法能够访问相应的private变量)。
- 基类与导出类有相同的接口
- 导出类的新差异:可以增添新的方法、或者覆盖原有方法。
1.6.1 “是一个”与“像一个”
“是一个”:将继承类当作基类,继承类只覆盖了原有方法,这种情况可以视为纯粹的替代。例如圆是一个形状。
“像一个”:继承类里添加了新的接口元素,但是旧有类型无法访问新的接口。例如热力泵像一个空调。
1.7 伴随多态的可互换对象:
问题:在处理类的层次结构时,经常想把一个对象作基类来看待(如计算形状的面积)。但是者在编译时会产生一个问题,即编译时无法得知具体该执行哪段代码。
解决办法:“后期绑定”。即在编译时仅检查调用参数和返回值的类型(强类型语言),在运行时根据对象内的信息计算方法的具体地址。
好处:对于强类型语言来说,不用程序员在写代码时,逐个判断对象的类型(如计算各类形状面积)。
1.8 单根继承结构
在Java中所有对象都有一个共有的接口,他们都属于一个相同的基类Object。
好处:
- 单根继承结构保证所有对象都具备某些功能,可以在系统上执行基础操作而不用去写额外的代码来判断类型。
- 单根继承结构使得垃圾回收机制变得简单。
1.9 容器
解决的问题:容器可以在任何需要的时候都可以拓充自己以容纳更多的东西。
产生的问题:Java SE5之前,所有的容器都是基于Object。这就会出现一个问题,当对象存储到容器中时,会向上转型。但是当取回对象时,需要进行向上转型,该如何正确的转型呢?
解决的办法:参数化类型(泛型)。如果进行向下转型和运行时检查(以某种方式记住对象的类型)会消耗额外的时间。Java SE5增加了参数化类型,即编译器直接定义一个只接收相应类型的容器,例如:
ArrayList<Shape> shapes = new ArrayList<Shape>();
1.10 对象创建的生命周期
- Java完全采用了动态内存的分配方式 ,即在堆内存中创建对象。
- Java垃圾回收器"知道"对象何时不再被使用,并自动释放对象多占用的内存。
- 这一点同所有对象都是继承自Object类,以及只能以一种方式创建对象(在堆上创建)这两个特性结合起来。
1.11 异常处理
Java内置了异常处理并且强制使用
1.12 并发编程
把问题分成多个可以独立运行的部分(任务)从而提高系统的响应能力,在程序中。这些独立运行的部分被称之为线程。隐患:资源共享。
1.13 Java与Internet
Java解决了在万维网上的程序设计问题:事务处理、客户端编程、服务器性能。
1.13.1 Web是什么–C/S计算机技术
系统有一个信息存储池,用来存储数据,可以根据需要将它分发给某些人或机器群。信息存储池、分发信息的软件、信息以及软件所驻留的机器/机器群统称为服务器。驻留在用户机器上的软件,负责与服务器进行通信,然后将它们显示在客户机上。
(1)Web浏览器
浏览器只是一个查看器,它甚至不能执行简单的计算任务。
(2)“客户端编程”
- 插件:可以下载一段代码,将其插在服务器适当的位置上,以此为浏览器增添新的功能。
- 脚本语言:插件引发了脚本语言,通过某种脚本的开发,可以将客户端程序的源代码直接插入到HTML页面中,解释这种语言的插件在HTML页面被显示前自动激活。
- Java:解决剩余20%的问题。Java可以通过applet以及使用Java Web Start来进行客户端编程。applet:自动下载、网络分发、需要Java解释器、解决表单检查、降低负载。
- .Net与C#:Java的竞争对手
- Internet与Intranet(企业内部网)
(3)服务器端编程
- 可以将生成的HTML页面发回给客户端,也可以发回主要数据,在客户端进行格式编排。
- 与数据库的交互。