1. 类的定义与结构
1.1 类的基本概念
类(Class)是对具有相同属性和行为的一组对象的抽象描述。类是面向对象程序设计的基础,是创建对象的模板。
类的三大组成部分:
| 组成部分 | 说明 | 示例 |
|---|---|---|
| 类名 | 类的唯一标识符 | Student、Car |
| 属性(成员变量) | 描述类的静态特征 | name、age、color |
| 方法(成员函数) | 描述类的动态行为 | study()、drive() |
1.2 对象的创建
对象是类的实例。通过类可以创建多个对象,每个对象都有自己的属性值。
类名 对象名 = new 类名();
2. 封装详解
2.1 封装的概念
封装(Encapsulation)是面向对象的三大特性之一,指将数据(属性)和操作数据的方法绑定在一起,并隐藏对象的内部实现细节。
2.2 访问控制修饰符
| 修饰符 | 同类 | 同包 | 子类 | 所有类 |
|---|---|---|---|---|
| public | 是 | 是 | 是 | 是 |
| protected | 是 | 是 | 是 | 否 |
| default | 是 | 是 | 否 | 否 |
| private | 是 | 否 | 否 | 否 |
2.3 封装的实现步骤
- 将属性设置为私有(private)
- 提供公共的getter和setter方法
- 在方法中加入数据验证逻辑
3. 继承详解
3.1 继承的概念
继承(Inheritance)是类之间的一种关系,子类可以继承父类的属性和方法,同时可以添加新的属性和方法或重写父类的方法。
3.2 继承的特点
- 代码复用:子类自动拥有父类的非私有成员
- 扩展性:子类可以在父类的基础上添加新功能
- 层次结构:形成类的层次体系
3.3 方法重写(Override)
子类重新定义父类中已有的方法,要求:
- 方法名相同
- 参数列表相同
- 返回值类型相同或是其子类型
- 访问权限不能比父类更严格
3.4 super关键字
- 调用父类的构造方法:
super(参数) - 调用父类的普通方法:
super.方法名(参数) - 访问父类的属性:
super.属性名
3.5 继承的注意事项
- 子类不能继承父类的私有成员
- 子类不能继承父类的构造方法
- Java不支持多继承(一个类只能有一个直接父类)
- 所有类都直接或间接继承自
Object类
4. 多态详解
4.1 多态的概念
多态(Polymorphism)是指同一个操作作用于不同的对象,可以产生不同的解释和执行结果。
多态的前提条件:
- 有继承关系或实现关系
- 子类重写了父类的方法
- 父类引用指向子类对象
4.2 方法重载(Overloading)
在同一个类中,方法名相同但参数列表不同。
重载的条件:
- 方法名相同
- 参数个数不同,或
- 参数类型不同,或
- 参数类型顺序不同
注意: 返回值类型不同不能作为重载的条件
4.3 方法重写(Overriding)
子类重新定义父类中已有的方法。
重写与重载的区别:
| 特性 | 方法重载(Overloading) | 方法重写(Overriding) |
|---|---|---|
| 位置 | 同一个类中 | 子类中 |
| 方法名 | 相同 | 相同 |
| 参数列表 | 不同 | 相同 |
| 返回值 | 可以不同 | 相同或是子类型 |
| 访问权限 | 可以不同 | 不能比父类更严格 |
| 异常 | 可以不同 | 不能比父类更宽泛 |
4.4 向上转型与向下转型
向上转型(Upcasting):
父类类型 变量名 = new 子类类型();
- 自动进行
- 安全
- 只能调用父类中声明的方法
向下转型(Downcasting):
子类类型 变量名 = (子类类型) 父类变量;
- 需要强制类型转换
- 可能抛出
ClassCastException - 建议先用
instanceof进行类型检查
4.5 静态绑定与动态绑定
| 绑定类型 | 时机 | 特点 |
|---|---|---|
| 静态绑定(早期绑定) | 编译时 | 调用私有方法、静态方法、final方法、构造方法 |
| 动态绑定(晚期绑定) | 运行时 | 调用实例方法,根据实际对象类型确定调用哪个方法 |
5. 抽象类与接口
5.1 抽象类
特点:
- 使用
abstract关键字修饰 - 可以包含抽象方法和非抽象方法
- 不能实例化
- 子类必须实现所有抽象方法(除非子类也是抽象类)
抽象方法:
- 使用
abstract关键字修饰 - 没有方法体
- 必须在抽象类中声明
5.2 接口
特点:
- 使用
interface关键字定义 - 所有方法默认是公共的抽象方法(JDK 8之前)
- 所有属性默认是公共的静态常量
- 一个类可以实现多个接口
JDK 8+ 新特性:
- 默认方法(default方法):有方法体,可以被重写
- 静态方法:有方法体,不能被重写
5.3 抽象类与接口的区别
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 关键字 | abstract class |
interface |
| 继承/实现 | 单继承 | 多实现 |
| 方法 | 可以有抽象方法和非抽象方法 | JDK 8之前只能有抽象方法 |
| 属性 | 可以有各种类型 | 默认是公共静态常量 |
| 构造方法 | 有 | 无 |
| 设计目的 | 作为基类,代码复用 | 定义规范,实现多态 |
6. 构造方法
6.1 构造方法的特点
- 方法名与类名相同
- 没有返回值类型(连void都没有)
- 在创建对象时自动调用
- 可以重载
6.2 构造方法的执行顺序
- 父类的构造方法
- 子类的构造方法
注意: 如果子类构造方法没有显式调用父类构造方法,则默认调用父类的无参构造方法。
7. this关键字
7.1 this的用法
| 用法 | 说明 |
|---|---|
this.属性 |
访问当前对象的属性 |
this.方法() |
调用当前对象的方法 |
this() |
调用当前类的其他构造方法 |
7.2 this的使用场景
- 区分成员变量和局部变量
- 在构造方法中调用其他构造方法
- 返回当前对象(链式调用)
8. 类之间的关系
8.1 UML类图中的关系
| 关系 | 说明 | 图示 |
|---|---|---|
| 关联(Association) | 类之间的引用关系 | 实线 |
| 依赖(Dependency) | 一个类使用另一个类 | 虚线箭头 |
| 聚合(Aggregation) | 整体与部分,部分可独立存在 | 空心菱形 |
| 组合(Composition) | 整体与部分,部分不能独立存在 | 实心菱形 |
| 泛化(Generalization) | 继承关系 | 空心三角箭头 |
| 实现(Realization) | 接口实现 | 虚线空心三角箭头 |
8.2 聚合与组合的区别
| 特性 | 聚合(Aggregation) | 组合(Composition) |
|---|---|---|
| 生命周期 | 部分和整体生命周期不一致 | 部分和整体生命周期一致 |
| 依赖关系 | 整体消失了,部分仍然存在 | 整体消失了,部分也消失 |
| 存在性 | 部分可以脱离整体存在 | 部分不可以脱离整体存在 |
| 示例 | 汽车与轮胎 | 人与心脏 |
评论