理解JAVA三大特性:封装继承多态
理解JAVA三大特性:封装继承多态
面试官问:“JAVA的三大特性是哪些?”
我们肯定都能回答出来:封装、继承和多态
那这三大特性到底都有什么作用呢?
1. 封装
定义:把数据和操作数据的方法捆在一起,控制访问权限(通常通过 private字段 + public getter/setter方法),以隐藏内部实现并保证状态的一致性。
- 也就是把一个对象应该有的哪些字段(成员变量)和应该有的属性(setter/getter方法)封装成一个类
在我们的项目中,最典型的例子就是我们的entity类和DTO/VO这些类(当然所有的类都包含封装特性)
1 | |
2. 继承
定义:子类继承父类的字段和方法,能够复用、扩展或重写父类行为。常用于抽象公共逻辑 / 模板方法 / 基类工具。
- 可以把多个子类中重复的代码抽取到父类中,提高代码的复用性
- 子类可以在父类的基础上增加其他功能,使子类更强大
另外:Java只支持单继承,不支持多继承,但支持多层继承
例如,在MyBatis-Plus中常见的继承场景:
1 | |
继承后你自动拥有以下这些方法可以直接调用:
- selectById
- selectList
- insert
- updateById
- deleteById
对比一下extends继承和implements实现:
| 对比点 | extends |
implements |
|---|---|---|
| 是否可以多继承 | ❌ 类只能 extends 1 个类 | ✅ 可以 implements 多个接口 |
| 是否必须实现方法 | ❌ 不必须(可直接用父类方法) | ✅ 必须实现接口的所有抽象方法 |
| 能否继承属性 | ✅ 可以 | ❌ 不可以 |
| 能否继承构造方法 | ❌ 不可以 | ❌ 不存在构造方法 |
| 是否属于继承体系 | ✅ 是 | ✅ 是(接口继承体系) |
3. 多态
定义:同一个接口或父类引用,在运行时可以指向不同的具体实现;调用方法时,执行具体实现的代码(运行时绑定)
多态的本质:
- 同一个父类型引用,在运行时指向不同的子类对象,并调用子类的方法实现
- 编译期看左边,运行期用右边
例如:
1 | |
编译期看左边 List,运行期用右边 ArrayList
最大的作用就是可以“无痛切换实现类”
- 如果此时你发现使用
LinkedList更好,可以直接更改右边的子类类型
1 | |
就只需要该这个类型即可,后面的所有代码都不需要改,这就是多态的好处