1.1抽象过程
1.万物皆对象
2.程序是对象的集合,他们通过发送消息来告知彼此要做的。
3.每个对象都有自己的由其他对象所构成的存储。(组合composition)
4.每个对象都拥有其类型。
5.某个特定的所有对象都可以接收同样的消息。
1.2每个对象都有一个接口
1.每一个对象都属于定义了特性和行为的某个特定的类。
2.类是描述具有相同特性(数据类型)和行为(功能)的对象集合。
3.有用的对象必须有某种方式产生对对象的请求,使对象完成任务,而这些请求都是由对象的接口(interface)定义。
1.3每个对象都提供服务
1.因为程序本身是向用户提供服务,而程序是对象的集合。
2.将整个程序划分为以对象为单位的多个服务,将有利于程序设计时对实体的抽象;同时提高对象的内聚性。
1.4被隐藏的具体实现
程序员
–> 类创建者(创建新数据类型的程序员)
–> 客户端程序员(应用中使用数据类型的程序员)
隐藏数据类型(访问控制public、private、protected)
1.保护对象内部脆弱的部分
2.便于理解哪些是重要的,哪些是可以忽略的
3.允许类创建者改变类内部工作方式而不影响客户端程序员
4.可以实现全局优化
1.5复用具体实现
最简单的复用即“创建一个成员对象”
//创建一个电池对象
class Battery
{
//充电功能
public void chargeBattery(double p)
{
if (this.power < 1.) {
this.power = this.power + p;
}
}
//用电功能
public boolean useBattery(double p)
{
if (this.power >= p) {
this.power = this.power - p;
return true;
}
else {
this.power = 0.0;
return false;
}
}
private double power = 0.0;
}
//创建一个手电筒
class Torch
{
/**
* 电筒开
* 10% power per hour use
* warning when out of power
*/
public void turnOn(int hours)
{
boolean usable;
usable = this.theBattery.useBattery( hours*0.1 );
if (usable != true) {
System.out.println("No more usable, must charge!");
}
}
/**
* 充电
* 20% power per hour charge
*/
public void charge(int hours)
{
//直接调用该私有电池的充电方法
this.theBattery.chargeBattery( hours*0.2 );
}
/**
* 创建一个私有的电池对象
* composition组合
*/
private Battery theBattery = new Battery();
}
Torch类使用了一个Battery类型的对象(theBattery)来作为数据成员。在Torch的方法中,我们通过操纵theBattery对象的接口,来实现Battery类所提供的功能(functionality)。
我们说,一个Torch对象拥有(has-a)一个Battery对象。
1.6继承
1.继承即表示不仅包括现有类型的所有成员,更重要的是它复制了基类的接口。
基类和导出类产生差异:
(1)直接在导出类中添加新方法
(2)覆盖(overriding)
1.7伴随多态的可互换对象
1.一个非面向对象编程的编译器产生的函数调用会引起“前期绑定”,意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。
2.面向对象程序设计语言使用了“后期绑定”的概念,当对象发送消息时,被调用的代码指导运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查。
后期绑定实现:java使用一小段特殊的代码来替换绝对地址调用,使其计算方法体的地址。
1.8单根继承结构
除C++以外的所有OOP语言,最终都继承自单一的基类——Object
1.你可以在每一个对象上执行某些基本操作
2.很容易在堆上创建,而参数传递会得到极大的简化
3.使垃圾回收器的实现变得容易得多
4.异常处理更为灵活
1.9容器
定义:因为无法确定需要多少空间来创建多少对象,所以创建了另一种对象类型,用于持有对其他对象的引用——容器。
C++的容器:标准模板类库(Standard Template Library,STL)
Object Pascal的容器:可视化构件库(Visual Component Library,VCL)
java的容器:List、Map和Set
1、参数化类型(泛型)
为了将原先置入容器中的Object对象还原为具有实用接口的对象:向下转型和参数化类型(泛型)
由于向下转型和运行时的检查需要额外的程序运行时间,所以运用参数化类型,编译器可以定制一个只接纳和取出特定对象的容器。<>
ArrayList<Shape> shapes = new ArrayList<Shape>();
1.10对象的创建和生命期
1、第一种:堆栈——为追求最大的执行素的,将对象至于堆栈或静态存储区域内,将存储空间分配和释放至于优先考虑的位置。
2、第二种:堆(heap)——在内存池中动态地创建对象,因为存储空间是在运行时被动态管理的,所以需要大量的时间在对重分配存储空间。
java提供了“垃圾回收器”的机制,可以自动发现对象何时不再被使用,继而销毁它。
1.11异常处理:处理错误
java的异常处理在众多的编程语言中格外引人注目,因为java一开始就内置了异常处理,而且强制你必须使用它。
1.12并发编程
并发——同一时刻处理多个任务
有多个并行任务都要访问同一项资源,则会出现问题。为解决这个问题,必须在使用期间将资源锁定。
java的并发是内置于语言中的,java SE5已经增添了大量额外的库支持。
java与Internet
服务器——信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群
客户机——通过驻留在用户机器上的软件与服务器进行通信,以获取信息、处理信息
中间件——为了将延时最小化,将负载分散给在服务器端的其他机器。
Web最初的“服务器——浏览器”设计是为了能够提供交互性的内容,但是其交互性完全由服务器提供。
通用网关接口(common gateway interface,CGI)——用于传递