1. 对象导论
1.1 抽象过程
-
面向对象的语言有五个特点
-
万物皆为对象
-
程序是对象的集合,它们通过发消息来通讯
-
每个对象都有自己的由其他对象所构成的存储
-
每个对象都有类型
-
某特定类型的所有对象都能收到同样的消息
-
1.2 每个对象都有一个接口
- 发送消息(产生请求):当向对象发送请求时,相关联的方法就会被调用
每个对象都是定义了特性和行为的某个特定的类
1.3 每个对象都提供服务
把对象看成服务提供者,有利于形成对象的高内聚
1.4 访问指定词
- 访问指定词
- public:任何人都能访问
- private:仅类型的创建者和类型内部方法能够使用
- protected:除类型的创建者和类型内部方法能够使用;继承的类也能访问(与private的区别)
- 默认(包访问权限):同一个包中的能够访问
1.5 复用具体实现
- 组合:使用现有的类合成新的类,经常被视为(has-a)拥有关系
- 聚合:动态发生的组合
1.6 继承
- 定义:以现有类为基础,复制出副本,并在副本上修改和添加来创建新类
- 现有类称为基类、源类、父类
-
副本类称为导出类、继承类、子类
-
通过继承产生的类型具有类型等价性
-
- 使基类和导出类差异的两个方法
- 在导出类添加新方法
- 在导出类中改变基类的方法(简称覆盖)
1.6.1 继承的分类
- 纯粹替代(也称替代原则):用一个导出类对象来完全替代一个基类对象
- 不完全替代:在导出类中扩展接口,但基类无法访问新添加的方法
1.7 多态
-
泛化:处理类型的层次结构时,不把对象当作特定类型处理,而是作为基类的对象处理
�面向对象程序设计的最重要妙诀:编译器不可能产生传统意义上的函数调用,而是采用前期绑定和后期绑定的方法
-
后期绑定:向对象发送消息时,被调用的代码直到运行时才能确定;再运行前,编译器仅仅确认调用方法的存在、被调用参数和返回值类型检查
由于OOP中,动态绑定是默认行为,所以程序直到运行时才确定代码的位置;根据消息来确定具体调用的代码,因此是动态的
-
多态:同一事物在不同场景下的多种形态
-
由于动态绑定是默认行为,所以在运行前无法确定调用的代码,因此根据消息来执行后期绑定,实现多态
当draw()消息发到一个匿名Shape时,会基于该Shape的实际类型产生正确的行为
void doSomething(Shape shape){ shape.draw(); shape.rease(); }
Circle circle = new Circle(); Triangle triangle = new Triangle(); Line line = new Line(); doSomething(circle); doSomething(triangle); doSomething(line);
-
1.8单根继承结构
- 单根继承:所有类最终都继承自单一的基类
- 优势
- 保证所有对象一定具备某些功能,方便执行基本操作
- 方便垃圾回收,因为所有对象都能确定类型
1.9容器
- 实际开发中,需要选择合适容器,原因为
- 不同容器有各自的接口和行为
- 不同容器效率不同
1.9.1参数化类型
-
范型:参数化类型,使用一对尖括号,中间包含类型信息
ArrayList<Shape> shapes = new ArrayList<Shape>();
-
向下转型:向下转型成为更加具体的类
- 向下转型的行为存在风险,会出现异常
1.10对象的创建和生命周期
- 对象的存储
- 对象置于堆栈或静态存储区域来实现:牺牲灵活性,存储空间分配优先考虑
- 在堆(heap)的内存池中动态的创建对象:保证灵活性,但直到运行时才知道对象数量
- Java采用动态内存分配方式
- 对象的生命周期
- java有垃圾回收器,因此能够自动释放对象占用的内存
- C++需要手动销毁对象,不然可能导致内存泄漏
1.11异常处理:处理错误
异常处理提供了一种从错误状态进行可靠恢复的途径
1.12并发编程
- 线程:彼此独立运行的部分
- 并发:多个线程同时运行
1.13Java与Internet
1.13.1Web
- 服务器:信息存储池、用于分发信息的软件以及信息和软件所驻留的机器或机群
1.13.2客户端编程
- 通用网关接口(CGI):数据表单的提交通过CGI传递
- 插件(plug-in):下载一段代码,插入到浏览器中适当位置,来扩展浏览器功能
网友评论