🚀 面向对象编程 (OOP):选项 D 学习笔记
欢迎来到面向对象编程的世界!别担心,虽然名字听起来有点高深,但它本质上是一种高效的代码组织方式,能让大型软件项目的开发变得更易管理、可复用且易于维护。
在这一章中,我们不再将程序视为一长串指令(过程式编程),而是将其视为相互作用的“事物”或对象 (Objects) 的集合。这种思维方式是当今几乎所有现代软件开发的基础,因此,掌握它对你的 IB 考试和未来的编程之路都至关重要!
1. 基础知识:类与对象
类 (Class) 和对象 (Object) 有什么区别?
这是 OOP 最关键的切入点。你必须清楚地分清“蓝图”与“根据蓝图建造的房子”之间的区别。
1.1 类 (Class):蓝图
- 类是一个模板、蓝图或对特定类型对象的定义。
- 它规定了该类的对象将包含哪些数据(属性)以及可以执行哪些操作(方法)。
- 类比:饼干模具。它定义了形状,但模具本身并不是饼干。
1.2 对象 (Object):实例
- 对象是类的一个真实、具体的实例。
- 它是根据类定义在计算机内存中创建的。
- 从类创建对象的过程称为实例化 (Instantiation)。
- 类比:用模具烤出来的真实饼干。每一块饼干都是一个独立的对象。
示例:
如果我们有一个名为 Car(汽车)的类,我们可以从中创建多个对象(实例):
- 对象 1:myCar(红色,60 英里/小时,Model X 型号)
- 对象 2:yourCar(蓝色,85 英里/小时,Model Y 型号)
关键要点:
类决定了结构;对象则是程序中发挥功能的实体。
2. 对象的剖析:状态与行为
OOP 中的每个对象都由以下两部分定义:
2.1 状态 (State)(属性/数据)
状态定义了对象所持有的特征或数据字段。这些通常被称为属性 (attributes) 或实例变量 (instance variables)。
- 示例:对于 Dog 对象,属性可能是:颜色、品种和年龄。
2.2 行为 (Behavior)(方法)
行为定义了对象能做什么。这些通过方法 (methods)(在类中定义的函数)来实现。
- 示例:对于 Dog 对象,方法可能是:bark()(叫)、run()(跑)或 eat()(吃)。
2.3 构造函数 (Constructors)
构造函数是一种特殊的方法,当实例化新对象时会自动调用它。它的主要职责是设置新对象的初始状态(初始化属性)。
- 类比:当你购买一部新手机(实例化一个对象)时,启动设置过程就是构造函数——设置语言、时区和初始配置(状态)。
2.4 消息传递 (Message Passing)
对象通过发送消息进行交互。在 OOP 术语中,“发送消息”意味着调用另一个对象的方法。
- 示例:如果对象 A 需要对象 B 执行某项操作,对象 A 就会调用对象 B 的方法。
常见的易错点:分不清属性和方法。属性是名词(数据);方法是动词(动作)。
3. OOP 的四大支柱
这四个原则是面向对象编程的结构核心。理解它们对 HL 考试至关重要。
3.1 封装 (Encapsulation)(粘合剂)
定义:
封装是将数据(属性)和操作这些数据的代码(方法)捆绑在一个单元(类)中,并限制对某些对象组件的直接访问。
类比:想象一颗药丸。药物(数据)被安全地包裹在胶囊壳(类)里。你只能通过壳上的说明(方法,例如“用水吞服”)来与药物交互。
信息隐藏 (实现封装)
封装的一个关键点是信息隐藏。我们将属性设置为私有 (private),从而保护对象的内部状态。然后,我们提供公共方法(称为存取器 (getters) 和修改器 (setters))来读取或更改这些私有数据。
- 为什么? 它能防止外部代码意外破坏数据。如果客户的银行余额绝对不能为负,那么“取款”方法可以在更改私有余额属性之前检查金额。
快速复习框:
封装 = 捆绑 + 保护。
它确保对象的内部机制保持私密,且只能通过受控的方式进行访问。
3.2 继承 (Inheritance)(家族树)
定义:
继承是一个类获取另一个类的属性和方法的一种机制。它允许代码复用并建立层次关系。
类比:家族树。子类继承父类的特征。子类不需要重新定义已继承的特征,但可以添加新的特征或修改现有的特征。
术语:
- 原始类称为父类 (Parent Class)、超类 (Superclass) 或基类 (Base Class)。
- 新类称为子类 (Child Class)、派生类 (Subclass) 或派生类 (Derived Class)。
好处:
继承遵循 DRY 原则:Don't Repeat Yourself(不要重复自己)。如果 Dog 和 Cat 都需要 eat() 方法和 age 属性,我们只需在 Animal 超类中定义一次,两个子类就可以继承它们。
3.3 多态 (Polymorphism)(多种形态)
如果一开始觉得这部分难懂,别担心——多态(意为“多种形态”)的核心在于灵活性和定义标准化的接口。
定义:
多态允许将不同类的对象视为通用类型(它们的超类)的对象,并使得单个操作(方法调用)根据对象的实际类表现出不同的行为。
类比:“启动引擎”功能。无论你对柴油卡车对象还是混合动力汽车对象调用“启动引擎”,所需的操作是一样的(启动引擎),但底层的实现细节(引擎具体如何启动)却是截然不同的。
核心机制:方法重写 (Method Overriding)
这是 IB 中最常见的多态形式。如果子类拥有与父类相同的方法签名(名称和参数),那么执行时将运行子类的版本,而不是父类的版本。这被称为方法重写。
- 示例:超类 Animal 拥有 makeSound() 方法,输出“Noise”。子类 Cow 重写了 makeSound() 以输出“Moo”。当你对 Cow 对象调用 makeSound() 时,你会得到“Moo”。
3.4 抽象 (Abstraction)(简化视图)
定义:
抽象是指只向外部世界展示基本信息,同时隐藏后台实现细节的过程。它关注对象“做什么”,而不是“如何实现”。
类比:驾驶汽车。你与踏板和方向盘(基本的接口)交互。你不需要了解内燃机、燃油喷射和齿轮传动的复杂物理学原理就能开车。那些复杂的细节都被隐藏(抽象化)起来了。
抽象 vs. 封装:
它们相关但有区别:
- 封装是一种机制(使用私有变量和方法),保持实现的整洁和安全。
- 抽象是一种概念或目标——它是向用户呈现的简化、基本的视图。
你知道吗?
正是因为有了抽象,程序员才能使用复杂的库(如图形库),而无需阅读成千上万行代码。他们只需要知道抽象接口定义的必要方法和参数即可。
🎉 总结与回顾
现在你已经掌握了 OOP 的核心原则!请记住,OOP 的设计初衷就是为了模拟现实世界。一旦你开始以现实生活中的实体来思考,类、对象和继承结构就会变得非常直观。
最后送你一个助记词来记住四大支柱:
A P I E (Abstraction 抽象, Polymorphism 多态, Inheritance 继承, Encapsulation 封装)
概念清单:
- 类是蓝图,定义属性(状态)和方法(行为)。
- 对象是类的一个实例,通过构造函数创建。
- 封装隐藏数据(使用私有属性)并通过公共方法提供受控访问。
- 继承允许子类复用和扩展父类的代码。
- 多态允许对象对相同的方法调用做出不同的响应(通常通过方法重写)。
- 抽象向用户展示基本特征,隐藏复杂性。
继续通过代码练习来定义和运用这些概念。你一定能行的!