面向对象
对象是编程的基本单位,一切都是对象。
一切都是对象,是否是语言设计失误?
基础概念¶
抽象¶
汇编语言是对计算机底层的一个极简化的抽象;所谓的高级语言都是各自对汇编语言的抽象。
解题空间(计算机的结构,机器模型,代码世界) <- 思考 -> 问题空间(问题的结构,问题模型,现实世界)。
面向计算机的设计方式理解成本高。
面向对象编程的一大挑战是,如何关联问题空间中的元素和解题空间中的对象。
对象¶
对象具有状态、行为及标识。
同一类对象:状态不同,但结构相同。
生命周期¶
创建对象,分配内存;销毁对象,释放内存。
引用¶
引用的作用是关联对象。
类¶
类描述了一系列具有相同结构和行为的对象。
基本特性¶
封装¶
将变化的事物和保持不变的事物分离。
分离接口和实现,通过访问控制隐藏实现,封装数据和功能,面向问题空间。
界限在任何关系中都很重要,所有相关方都应该遵循。
继承¶
复用实现,优先组合。
向上转型¶
继承图 —— 单根层次结构。
向下转型¶
多态¶
将一个方法调用和一个方法体关联起来的动作称为绑定。
前期绑定(编译时),后期绑定(运行时绑定,亦动态绑定)。
在 Java 中,除了 static/final/private 方法外,都是动态绑定。
多态将做什么和怎么做解耦。
基本原则¶
里氏替换原则¶
定义¶
如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型;
所有引用基类的地方必须能透明地使用其子类的对象。
实践¶
尽可能应用纯替换原则。
最后更新: September 10, 2023