第一章 对象的概念
1. 语言的束缚与编程本质
语言的力量:语言结构通过语义反应机制无意识地塑造思维(Alfred Korzybski)。
编程语言的角色:不仅是工具,更是思想的延伸,灵感源于写作、绘画等表达形式。
OOP本质:一种编程思维和架构方式,需结合实践才能深入理解。
2. 抽象机制
- 抽象的价值:问题复杂度取决于抽象的类型和质量。
- 抽象演进:
汇编 → 命令式语言(FORTRAN/BASIC/C)→ 面向对象语言。 - 核心问题:传统语言要求开发者将问题空间映射到机器模型(解决方案空间),过程复杂且易错。
3. 面向对象的核心思想
对象(Object):
- 问题空间元素的直接映射。
- 包含状态(数据)和行为(方法),类似现实世界的实体。
五大特征(Alan Kay, Smalltalk):
1.万物皆对象:对象是存储数据并执行操作的实体。
2.消息传递:程序通过对象间消息传递协作。
3.对象嵌套:对象可包含其他对象,支持复杂结构。
4.类型与类:对象是类的实例,类定义可接收的消息。
5.可替换性:子类对象可替代父类对象(多态基础)。
4. 接口(Interface)
- 定义:对象接收请求的入口,由类规定其形式。
示例:Light lt = new Light(); lt.on();
- Light 类定义接口(如 on()),对象通过接口响应请求。
- UML表示:类名 + 公共方法(隐藏实现细节)。
5. 设计原则
服务提供模型:
- 对象是服务提供者,程序通过组合对象服务解决问题。
- 高内聚原则:每个对象功能单一明确(如打印机模块拆分为排版、型号识别、任务执行)。
封装(Encapsulation):
- 目的:隔离实现细节,防止误用;支持后续优化。
访问控制:
public:完全开放。 private:仅类内部访问。 protected:子类可访问。 default:同包内可访问。
6. 复用与组合
复用方式:
- 组合(Composition):强"拥有"关系(如汽车拥有引擎),生命周期同步。
- 聚合(Aggregation):弱"包含"关系(如购物车包含商品),生命周期独立。
- 优先组合而非继承:组合更灵活,运行时可动态调整行为。
7. 继承(Inheritance)
- 核心:基于现有类创建新类(子类),复用父类接口与实现。
类型关系:
is-a(纯粹替代):子类完全替代父类(如圆是形状)。
- is-like-a(接口扩展):子类扩展新方法(如热力泵像空调但支持制热)。
- 覆盖(Overriding):子类重定义父类方法以改变行为。
8. 多态(Polymorphism)
机制:
向上转型(Upcasting):将子类对象视为父类类型。
- 动态绑定(Dynamic Binding):运行时根据对象实际类型调用方法(Java默认支持)。
- 价值:代码与类型解耦,易于扩展(如添加新形状无需修改通用逻辑)。
void doSomething(Shape shape) {
shape.erase();
shape.draw(); // 实际调用子类方法(圆/三角形等)
}
9. 单继承结构
- Java设计:所有类继承自 Object(根类)。
优势:
简化垃圾回收。
- 确保运行时类型信息一致(利于异常处理等系统操作)。
10. 集合(Collection)
- 作用:动态管理对象组,解决数量与生命周期的不确定性。
- 泛型(Generics):确保类型安全(Java 5+):
ArrayList<Shape> shapes = new ArrayList<>(); // 仅存Shape对象
常见类型:
- List(序列)、Map(键值对)、Set(不重复元素)。
11. 对象生命周期
- 创建:new 动态分配堆内存。
- 销毁:垃圾收集器(GC)自动回收无用对象,避免内存泄漏(对比C++手动管理)。
12. 异常处理
- 机制:将错误封装为对象,通过 throw/catch 分离正常逻辑与错误处理。
- Java强制要求:必须处理受检异常(编译时检查),提升健壮性。
13. OOP核心优势
- 问题导向:代码直接映射问题模型(而非机器结构)。
- 可读性与复用:通过封装、继承、多态降低复杂度,提升代码复用。
- 灵活扩展:新增类型不影响既有逻辑(如多态与集合泛型)。
本章小结
OOP核心:通过对象、类、消息传递构建问题模型。
关键特性:封装(安全)、继承(复用)、多态(解耦)。
Java设计取舍:单继承+垃圾回收简化开发,牺牲部分灵活性(对比C++)。
适用性:适合需高可读性、可扩展性的项目,但需评估实际需求(如性能敏感场景)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。