🚀 面向对象编程 (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(不要重复自己)。如果 DogCat 都需要 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 封装)

概念清单:
  • 是蓝图,定义属性(状态)和方法(行为)。
  • 对象是类的一个实例,通过构造函数创建。
  • 封装隐藏数据(使用私有属性)并通过公共方法提供受控访问。
  • 继承允许子类复用和扩展父类的代码。
  • 多态允许对象对相同的方法调用做出不同的响应(通常通过方法重写)。
  • 抽象向用户展示基本特征,隐藏复杂性。

继续通过代码练习来定义和运用这些概念。你一定能行的!