# 📚 C# 面向对象程序设计 – 考前复习知识点

> 来源：课堂录音转文字整理 | 考试时间：7号下午2:00

---

## 📋 目录

1. [考试基本信息](#一考试基本信息)
2. [面向对象三大基石](#二面向对象三大基石三大基本特征)
3. [访问修饰符](#三访问修饰符access-modifiers-必考)
4. [类的核心成员](#四类class的核心成员)
5. [创建类和对象](#五如何创建类和对象-核心考点)
6. [构造函数](#六构造函数constructor-必考)
7. [析构函数](#七析构函数destructor)
8. [方法重载](#八方法重载method-overloading-核心考点)
9. [继承](#九继承inheritance)
10. [多态](#十多态polymorphism)
11. [异常处理](#十一异常处理exception-handling)
12. [文件操作](#十二文件操作file-io-重点)
13. [考试题型与答题技巧](#十三考试题型与答题技巧)
14. [重点章节总结](#十四重点章节总结)
15. [老师最后叮嘱](#十五老师最后叮嘱)

---

## 一、考试基本信息

| 项目 | 内容 |
|------|------|
| **考试时间** | 7号，下午第一场 2:00 |
| **考试范围** | 第2章（基础语法）、第3章（字符串和类）、第4章（类和对象）、第5章（继承和多态） |
| **核心章节** | **第2章** 和 **第4章** 是最基础的，考题中大量出现 |
| **大题结构** | ① 基础语法题 ② 数组题 ③ 编程题（30分，分值最大） |
| **小题类型** | 选择题、判断题、程序填空题、程序改错题 |
| **复习资料** | 复习 PPT 已发到在线网络平台，可下载查看 |

---

## 二、面向对象三大基石（三大基本特征）

> **考试必记**：**封装（Encapsulation）、继承（Inheritance）、多态（Polymorphism）**

### 1️⃣ 封装（Encapsulation）

- **狭义理解**：定义一个类，把行为和属性包装起来，只对外提供接口，隐藏内部实现。
- **核心操作**：创建类 → 在类中添加字段（属性）和方法。

### 2️⃣ 继承（Inheritance）

- **语法**：使用冒号 `:` 表示继承关系。
- 子类可以访问父类中被 `protected` 修饰的成员。

### 3️⃣ 多态（Polymorphism）

- **前提**：必须基于继承关系（两个类之间有继承关系才能实现多态）。
- **实现方式**：
  - **虚方法（virtual）+ 重写（override）**
  - **抽象类 + 抽象方法的重写**
  - **接口（Interface）**
- 多态能够提高程序的**扩展性**。

---

## 三、访问修饰符（Access Modifiers）⭐ 必考

| 访问修饰符 | 访问范围 | 说明 |
|-----------|---------|------|
| `public` | **最大范围** | **所有类都可以访问** |
| `private` | **最小范围** | **仅本类内部可以访问** |
| `protected` | 本类 + 子类 | 涉及继承关系时使用 |
| `internal` | 同一程序集内 | 考试较少涉及 |

> ⚠️ **答题技巧**：如果不确定访问修饰符怎么写，**建议不写**（默认）。写错了反而不易得分。
>
> **语法位置**：访问修饰符写在**最前面**，后面跟数据类型和字段名。
>
> ```csharp
> public double length;  // 访问修饰符 + 数据类型 + 字段名
> ```

---

## 四、类（Class）的核心成员

一个类包含**三大核心成员**：

### 1. 字段（Field）

- 类的变量，直接声明。

**不同数据类型的默认值**（教材81页表4.1）：

| 数据类型 | 默认值 |
|---------|-------|
| 整数（int） | `0` |
| 浮点数（double/float） | `0.0` |
| 字符串（string） | `null` |
| 字符（char） | `'\0'`（空字符） |
| 布尔（bool） | `false` |

### 2. 属性（Property）

- 类似字段，但**可以控制读写权限**（通过 `get` 和 `set` 访问器）。

```csharp
private double area;       // 字段（backing field）
public double Area         // 属性
{
    get { return area; }   // get：返回字段值
    set { area = value; }  // set：传值赋值给字段
}
```

| 访问器 | 作用 |
|-------|------|
| `get` | 返回一个值（`return`） |
| `set` | 传值赋值给字段（通过 `value` 关键字） |

### 3. 方法（Method）

- 定义格式：`[访问修饰符] 返回类型 方法名(参数列表) { 方法体 }`

### 访问类的成员

- 使用**点运算符（`.`）**：

```csharp
Shape s1 = new Shape();  // 创建对象
s1.length = 1.0;         // 对象名.字段名 = 值
```

---

## 五、如何创建类和对象 ⭐ 核心考点

### 创建类

```csharp
class Shape
{
    // 字段
    // 属性
    // 方法
}
```

### 创建对象

```csharp
类名 对象名 = new 构造函数();

// 示例：
Shape s1 = new Shape();
```

### 创建对象四步走

1. 写**类名**
2. 写**对象名**（如 `s1`）
3. `=` 赋值 + `new` **操作符**
4. `new` 后跟**构造函数**（与类名相同 + 小括号）

> 💡 **老师强调**：即使不会写完整代码，也要先把**类的基本结构**写出来，就能得分！

---

## 六、构造函数（Constructor）⭐ 必考

### 定义

构造函数是类中的一种**特殊方法**，满足**三个条件**即为构造函数：

| 条件 | 说明 |
|------|------|
| ① **方法名与类名相同** | 完全一致 |
| ② **没有返回值声明** | 连 `void` 都不能写 |
| ③ **方法体中不能有 `return` 语句返回值** | 不能使用 `return` 返回数据 |

### 语法

```csharp
class Shape
{
    public Shape()   // 构造函数：无返回类型，方法名与类名相同
    {
        // 初始化代码
    }
}
```

### 默认构造函数

- 每个类都有一个**默认的无参构造函数**（可以不写出来）。
- 如果没写，系统自动提供。

### 构造函数重载

- 可以存在**多个构造函数**，参数列表不同，提供不同的初始化方式。
- 构造方法的访问修饰符一般采用 `public`。

---

## 七、析构函数（Destructor）

### 作用

- 当对象**脱离作用域**时自动调用，用于**释放内存/资源**（拆除机制）。
- 和构造函数**相互对应**（创建 vs 拆除）。

### 语法

- 在构造函数前面加一个**波浪线 `~`**：

```csharp
~Shape()   // 析构函数
{
    // 清理代码
}
```

### 默认析构函数

- 每个类都有默认的析构函数，**不需要手动写出**。

---

## 八、方法重载（Method Overloading）⭐ 核心考点

### 定义

- 在同一个类中，**允许多个方法使用同一个方法名**。
- **区分条件**：参数的**个数不同** 或 **参数的类型不同**。

### ✅ 属于重载的情况

| 情况 | 示例 | 是否重载 |
|------|------|---------|
| 参数类型不同 | `Calculate(int)` vs `Calculate(double)` | ✅ 是 |
| 参数个数不同 | `Calculate(int)` vs `Calculate(int, int)` | ✅ 是 |
| 参数个数和类型都不同 | `Calculate(int)` vs `Calculate(double, int)` | ✅ 是 |

### ❌ 不属于重载的情况

- **仅返回类型不同，参数列表完全相同** → 不算重载！

```csharp
int Calculate(int a)      // 方法1
double Calculate(int a)   // 方法2 ❌ 仅返回值不同，不算重载！
```

> **核心记住**：方法重载只区别于**参数**，与**返回类型无关**。

---

## 九、继承（Inheritance）

- **语法**：用冒号 `:` 表示继承

```csharp
class Circle : Shape   // Circle 继承自 Shape
{
    // ...
}
```

- 子类继承父类的非私有成员。
- `protected` 修饰的成员在**本类和子类**中可以访问。

---

## 十、多态（Polymorphism）

### 方式一：虚方法（Virtual）+ 重写（Override）

```csharp
class Shape
{
    public virtual double GetArea()   // 虚方法（virtual）
    {
        return 0;
    }
}

class Circle : Shape
{
    public override double GetArea()  // 重写（override）
    {
        return Math.PI * radius * radius;
    }
}
```

### 方式二：抽象类 + 抽象方法重写

```csharp
abstract class Shape
{
    public abstract double GetArea();  // 抽象方法（没有方法体）
}

class Circle : Shape
{
    public override double GetArea()   // 重写抽象方法
    {
        return Math.PI * radius * radius;
    }
}
```

### ⚠️ 易错点

| 易错点 | 说明 |
|-------|------|
| ❌ **静态方法（static）不能被重写** | 这是常见错误选项 |
| ✅ 多态必须**基于继承关系** | 两个类之间必须有继承 |
| ✅ 需要配合 `virtual` + `override` 或 `abstract` + `override` | 关键字不能少 |

---

## 十一、异常处理（Exception Handling）

- 使用 `try-catch-finally` 结构。
- 考试涉及**较少**（后两个标点章节），但需要了解基本用法。

---

## 十二、文件操作（File I/O）⭐ 重点

### 命名空间

- 文件操作类在 **`System.IO`** 命名空间下。
- 使用前需引入：

```csharp
using System.IO;
```

### FileStream

- 用于读写**字节数据**。
- 所在的命名空间也是 `System.IO`。

### 记忆技巧

> **IO = Input + Output**（输入输出），文件读写就是输入输出操作。

---

## 十三、考试题型与答题技巧

### 1. 选择题

- 考察基本概念：访问修饰符作用域、运算符优先级、表达式求值等。
- **有些题不用学也能推理**（如文件名包含 IO 就是输入输出）。

### 2. 判断题

- 考察基础理论，稍微记忆即可。

### 3. 程序填空题 / 改错题

**常见错误类型**：

| 错误类型 | 示例 | 正确写法 |
|---------|------|---------|
| 循环边界错误 | `i <= length` | `i < length` 或 `i <= length-1` |
| 变量未初始化 | `sum` 没有赋初值 | `int sum = 0;` |
| 类型不匹配 | `int / int` 赋值给 `double` | 需要类型转换 |
| 语法错误 | 缺分号、缺括号 | 补全语法 |
| 命名错误 | 变量名或方法名写错 | 修正命名 |

> 💡 **技巧**：改错题即使不完全确定，把认为错误的地方写出来，把改正写在旁边，**能得2分**。

### 4. 编程题（30分，分值最大）

**答题模板**：

```csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        // 创建对象
        // 调用方法
    }
}
```

> ⚠️ **无论如何不要空着！** 老师反复强调：**把基本结构写上去，意思对了就给分！**

### 考试注意事项

| 建议 | 说明 |
|------|------|
| **不要作弊/抄袭** | 被抓到记入教务处，影响学位证 |
| **不要提前交卷** | 必须坐够1小时，认真检查 |
| **能写就写** | 不会也要写点东西，老师会尽量给分 |
| **仔细读题** | 看清楚是虚方法重写还是抽象方法重写 |
| **用黑色中性笔** | 考试要求 |

---

## 十四、重点章节总结

| 章节 | 内容 | 重要程度 |
|------|------|---------|
| **第2章** | C# 基本语法（运算符、表达式、流程控制、数组） | ⭐⭐⭐⭐⭐ |
| **第3章** | 字符串和类 | ⭐⭐⭐ |
| **第4章** | 类和对象（封装、访问修饰符、构造函数、方法重载） | ⭐⭐⭐⭐⭐ |
| **第5章** | 继承和多态（虚方法、抽象类、接口、重写） | ⭐⭐⭐⭐（大题多） |
| **第10章** | 文件操作（FileStream、System.IO） | ⭐⭐⭐（小题） |

### 运算符优先级

- 主要用在**表达式求解**的选择题中。
- 需要灵活使用运算符的优先级。

### 数组

- 第2道大题专门考数组。
- 改错题中常见数组边界错误（`i < length` 还是 `i <= length`）。

---

## 十五、老师最后叮嘱

1. **第2章和第4章是基础**，考题中大量应用，不是直接考概念描述，而是**作为应用来考**。
2. **继承和多态多考大题**（编程题、改错题），复习PPT中的程序案例（求素数、求累加和等）要自己看一遍。
3. **作业还没交的抓紧补交**，平时分40多分很重要。
4. **C# 基础语法和 C 语言很相似**，C 学得好的人有优势。
5. **拿到卷子不要慌**，题目其实很简单，认真作答即可。
6. **判断区间怎么写**、**表达式的值**、**if语句输出结果**——这些都是选择题常考内容。
7. 最终的大题是**创建对象调用方法实现计算面积**，要记住怎么创建类和怎么创建对象。
8. 搞清楚题目到底让用**虚方法重写**还是**抽象方法重写**，这个非常重要。

---

> 🎯 **祝考试顺利！加油！**
