概述
面向对象编程(Object-Oriented Programming,OOP)是一种程序设计范式,它将程序中的数据和操作数据的方法封装成对象,通过对象之间的交互来完成程序功能。面向过程 vs 面向对象
| 特点 | 面向过程 | 面向对象 |
|---|---|---|
| 核心思想 | 按步骤分解问题 | 按对象分解问题 |
| 代码组织 | 函数 | 类和对象 |
| 数据处理 | 数据与函数分离 | 数据与方法封装在一起 |
| 代码复用 | 函数调用 | 继承、组合 |
| 扩展性 | 较差 | 较好 |
| 典型语言 | C、Pascal | Java、C++、Python |
类与对象
基本概念
- 类(Class):是对象的模板/蓝图,定义了对象的属性和行为
- 对象(Object):是类的实例,是实际存在的个体
类的组成
封装
封装是面向对象的核心特性之一,指将对象的状态(属性)和行为(方法)包装在类中,对外隐藏实现细节,只暴露必要的接口。访问修饰符
| 修饰符 | 同类 | 同包 | 子类 | 其他包 |
|---|---|---|---|---|
| private | ✓ | ✗ | ✗ | ✗ |
| default | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
JavaBean 规范
- 隐藏实现细节,提高安全性
- 可以在 setter 中添加数据校验
- 提高代码的可维护性
- 便于修改内部实现而不影响外部调用
继承
继承是面向对象的重要特性,允许子类继承父类的属性和方法,实现代码复用。继承语法
继承特点
- Java 只支持单继承,一个类只能有一个直接父类
- 支持多层继承:A → B → C
- 子类继承父类所有非私有成员
- 构造方法不能被继承
- 所有类都直接或间接继承自
Object类
super 关键字
方法重写(Override)
子类重新定义父类中已有的方法:重写 vs 重载
| 特性 | 重写(Override) | 重载(Overload) |
|---|---|---|
| 位置 | 子类与父类之间 | 同一个类中 |
| 方法名 | 必须相同 | 必须相同 |
| 参数列表 | 必须相同 | 必须不同 |
| 返回类型 | 相同或子类型 | 无要求 |
| 访问权限 | 不能更严格 | 无要求 |
| 多态类型 | 运行时多态 | 编译时多态 |
多态
多态是指同一个行为具有多种不同表现形式。在 Java 中,多态主要体现为父类引用指向子类对象。多态的实现
多态的特点
- 编译看左边:编译时检查父类是否有该方法
- 运行看右边:运行时执行子类重写的方法
类型转换
多态的好处
抽象类
抽象类是不能被实例化的类,用于定义一组子类的通用行为。抽象类语法
抽象类特点
- 使用
abstract关键字修饰 - 不能被实例化
- 可以有构造方法(供子类调用)
- 可以有抽象方法和普通方法
- 子类必须实现所有抽象方法,否则子类也要声明为抽象类
接口
接口是一种完全抽象的类型,定义了一组行为规范。接口语法
接口特点
- 接口中的方法默认是
public abstract - 接口中的变量默认是
public static final - 一个类可以实现多个接口
- 接口可以继承多个接口
- 接口不能有构造方法
抽象类 vs 接口
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 关键字 | abstract class | interface |
| 继承/实现 | extends(单继承) | implements(多实现) |
| 构造方法 | 可以有 | 不能有 |
| 成员变量 | 可以有各种类型 | 只能是常量 |
| 方法 | 可以有抽象和非抽象方法 | 抽象方法、默认方法、静态方法 |
| 设计目的 | 代码复用 | 定义行为规范 |
内部类
内部类是定义在另一个类内部的类。成员内部类
静态内部类
局部内部类
匿名内部类
Object 类
Object 是所有类的根类,所有类都直接或间接继承自 Object。
常用方法
| 方法 | 说明 |
|---|---|
| toString() | 返回对象的字符串表示 |
| equals(Object) | 判断两个对象是否相等 |
| hashCode() | 返回对象的哈希码 |
| getClass() | 返回对象的运行时类 |
| clone() | 创建并返回对象的副本 |
| finalize() | 垃圾回收前调用(已废弃) |
重写 equals 和 hashCode
final 关键字
final 可以修饰类、方法、变量:
static 关键字
static 修饰的成员属于类,而不是对象。