第 13 章:面向对象思想入门
学习目标
- 理解为什么需要面向对象(OOP)
- 掌握类与对象的关系
- 建立 OOP 的基本思维方式
一、从过程式到面向对象
假设你要实现一个简单的"学生成绩管理"系统。
过程式写法(不推荐)
java
// 数据和操作分离
String[] names = {"张三", "李四", "王五"};
int[] scores = {85, 92, 78};
// 求平均分
double average = 0;
for (int score : scores) {
average += score;
}
average /= scores.length;
// 打印成绩单
for (int i = 0; i < names.length; i++) {
System.out.println(names[i] + ": " + scores[i]);
}问题:
- 数据和操作分离,names 和 scores 必须同步遍历
- 多个函数操作同一份数据,容易出错
- 难以扩展(比如新增"班级"字段,要改所有函数)
面向对象写法(推荐)
java
class Student {
String name;
int score;
void print() {
System.out.println(name + ": " + score);
}
}
Student[] students = {
new Student("张三", 85),
new Student("李四", 92),
new Student("王五", 78)
};
for (Student s : students) {
s.print(); // ① 数据和操作绑定在一起
}二、OOP 的核心思想
三、类与对象
3.1 类 = 模板
类是对象的蓝图/模板,定义对象有什么字段、什么方法。
java
class Student { // ① 类:定义模板
String name; // ② 字段(属性)
int score;
void print() { // ③ 方法(行为)
System.out.println(name + ": " + score);
}
}3.2 对象 = 实例
对象是类的具体实例。
java
Student s1 = new Student(); // ① 创建对象
s1.name = "张三"; // ② 设置字段
s1.score = 85;
s1.print(); // ③ 调用方法
Student s2 = new Student();
s2.name = "李四";
s2.score = 92;
s2.print();3.3 类比
| 类比 | Java |
|---|---|
| 建筑图纸 | 类 |
| 具体建筑 | 对象 |
| 户型 | 字段 |
| 功能 | 方法 |
四、为什么要用 OOP?
示例:电商系统的订单处理
java
// 过程式:所有逻辑混在一起
public static void processOrder() {
validate();
calculate();
payment();
notify();
}
// OOP:每个职责一个类
class OrderValidator { void validate() {} }
class PriceCalculator { BigDecimal calculate() {} }
class PaymentProcessor { void pay() {} }
class NotificationService { void notify() {} }
class OrderService { // ① 订单服务组合各个组件
private final OrderValidator validator;
private final PriceCalculator calculator;
private final PaymentProcessor payment;
private final NotificationService notifier;
public void processOrder(Order order) {
validator.validate(order);
BigDecimal price = calculator.calculate(order);
payment.pay(order, price);
notifier.notify(order);
}
}五、万物皆对象?
Java 社区有句名言:"一切皆对象"。但严格说,基本类型不是对象:
| 类型 | 是否对象 |
|---|---|
| 8 种基本类型 | ❌ 不是 |
| 数组 | ✅ 是(继承 Object) |
| 类实例 | ✅ 是 |
| 枚举 | ✅ 是 |
java
int i = 10; // ❌ 基本类型
Integer ii = 10; // ✅ 包装类是对象
String s = "hello"; // ✅ String 是对象
int[] arr = {1, 2, 3}; // ✅ 数组是对象(继承 Object)Java 通过包装类把基本类型伪装成对象,以适配集合、泛型等场景。
六、OOP vs 其他范式
| 范式 | 代表语言 | 思想 |
|---|---|---|
| 过程式 | C | 函数 + 数据结构 |
| 面向对象 | Java / C++ | 类 + 对象 + 继承 + 多态 |
| 函数式 | Haskell / Erlang | 函数是一等公民 |
| 响应式 | RxJava / Reactor | 数据流 + 变换 |
Java 是多范式语言:OOP 是基础,也支持函数式(Lambda)和响应式(Reactor)。
七、本章小结
| 要点 | 关键 |
|---|---|
| OOP 的核心 | 封装 + 继承 + 多态 |
| 类 | 对象的模板,定义字段和方法 |
| 对象 | 类的实例,存放在堆 |
| OOP 优势 | 模块化、可维护、可复用、可扩展 |
| Java 不是纯 OOP | 8 种基本类型不是对象 |
下一章:第 14 章:类的定义与对象创建 →