面向对象
1. 什么是面向对象编程 (OOP)?
面向对象编程是一种程序设计范式,它将数据和对数据的操作封装在对象中,通过对象之间的交互来完成程序功能。
核心思想:
- 将现实世界的事物抽象为对象
- 对象包含属性(数据)和方法(行为)
- 通过对象间的协作完成任务
示例:
1 | // 买只猫,猫有抓老鼠的方法,对象本身具有的方法 |
2. 面向对象的三大基本特征
2.1 封装 (Encapsulation)
定义: 把数据和操作数据的方法包装起来,对外隐藏内部实现细节,只能通过已定义的接口访问。
实现方式:
- 使用
private、protected、public等访问修饰符控制访问权限 - 提供公共的 getter/setter 方法访问私有属性
优点:
- 提高安全性,防止外部直接修改数据
- 降低耦合,便于维护和复用
- 隐藏实现细节,使用者无需关心内部逻辑
示例:
1 | class Student { |
2.2 继承 (Inheritance)
定义: 子类继承父类的特征和行为(属性和方法),使子类自动拥有父类的非私有成员。
关键字: extends(类继承)、implements(接口实现)
优点:
- 减少代码重复,提高复用性
- 建立类与类之间的关系,为多态奠定基础
- 便于代码扩展和维护
特点:
- 子类拥有父类非 private 的属性和方法
- 子类可以重写(override)父类的方法
- Java 不支持多继承(一个类只能有一个直接父类),但支持多层继承
- 所有类都继承自
java.lang.Object类
示例:
1 | // 父类 |
注意事项:
final修饰的类不能被继承final修饰的方法不能被重写- 构造方法不能被继承
2.3 多态 (Polymorphism)
定义: 同一个行为具有多个不同表现形式或形态的能力。
实现条件:
- 要有继承关系
- 要有方法重写
- 要有父类引用指向子类对象
表现形式:
- 编译时多态(静态多态): 方法重载(Overload)
- 运行时多态(动态多态): 方法重写(Override)
优点:
- 降低耦合,提高灵活性
- 增强代码的可扩展性和可维护性
- 使代码更通用,便于统一处理
示例:
1 | // 父类引用指向子类对象 |
instanceof 关键字:
- 用于判断对象是否是某个类的实例
- 语法:
object instanceof Class - 常用于类型转换前的安全检查
3. 面向对象的其他重要概念
3.1 抽象 (Abstraction)
定义: 提取事物的共同特征,忽略不相关的细节,形成抽象类或接口。
实现方式:
- 使用
abstract关键字声明抽象类或抽象方法 - 抽象方法只有声明,没有实现体
- 抽象类不能实例化,必须由子类继承并实现抽象方法
抽象类的特点:
- 抽象类不一定包含抽象方法,但有抽象方法的类必须是抽象类
- 抽象类可以有普通方法和属性
- 子类必须实现父类的所有抽象方法,否则子类也是抽象类
- 抽象类不能用
final修饰
示例:
1 | // 抽象类 |
3.2 接口 (Interface)
定义: 接口的抽象方法的集合,定义了类应该实现的行为规范。
特点:
- 接口中的方法默认是
public abstract的 - 接口中的变量默认是
public static final的 - 接口不能被实例化,需要被类实现
- 接口支持多继承(一个接口可以继承多个接口)
- 类可以实现多个接口
示例:
1 | // 定义接口 |
JDK8+ 新特性:
- 接口可以有
default方法(带方法体的默认方法) - 接口可以有
static方法(静态方法)
1 | interface Payable { |
3.3 方法重载 (Overload) vs 方法重写 (Override)
| 对比项 | 重载 (Overload) | 重写 (Override) |
|---|---|---|
| 发生位置 | 同一个类中 | 父子类之间 |
| 方法名 | 相同 | 相同 |
| 参数列表 | 必须不同(类型/个数/顺序) | 必须相同 |
| 返回类型 | 可以不同 | 必须相同或是其子类型 |
| 访问修饰符 | 可以不同 | 不能比父类更严格 |
| 异常处理 | 可以不同 | 不能抛出更多受检异常 |
重载示例:
1 | class Calculator { |
重写示例:
1 | class Animal { |
4. 面向对象 vs 面向过程
| 对比项 | 面向过程 | 面向对象 |
|---|---|---|
| 核心思想 | 按步骤执行 | 对象协作 |
| 关注点 | 过程和步骤 | 对象和职责 |
| 适用场景 | 简单任务、性能要求高 | 复杂系统、需求多变 |
| 优缺点 | 性能好,但复用性差、维护困难 | 易复用、易维护,但性能略低 |
| 代表语言 | C | Java、C++、Python |
示例对比:
1 | // 面向过程:把大象装进冰箱 |
说些什么吧!