第一章 对象的概念

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++)。
适用性:适合需高可读性、可扩展性的项目,但需评估实际需求(如性能敏感场景)。


Heafib
1 声望0 粉丝