一、封装(Encapsulation)——"黑箱操作,安全第一"
核心思想
- 将对象的**属性(数据)和操作这些属性的方法(行为)**捆绑在一起,形成一个独立的单元(即"对象")。
- 将对象的内部实现细节隐藏起来,只对外暴露**有限的、必要的接口(方法)**供其他对象访问。
- 目的: 提高安全性、降低耦合度、增强可维护性。
Java 中的实现关键
访问权限修饰符(Access Modifiers):
| 修饰符 | 可见范围 | 说明 |
|---|---|---|
private | 仅本类内部可见 | 最严格的封装 |
protected | 本类、同包类、不同包子类可见 | 常用于继承体系 |
default(不写修饰符) | 仅同包类可见 | 包私有 |
public | 所有地方可见 | 最开放的封装 |
Getter / Setter 方法:
- 提供
public的getXxx()方法来安全地获取private属性的值。 - 提供
public的setXxx()方法来安全地设置private属性的值(通常包含数据验证逻辑)。 - 面试题: 为什么属性通常设为
private,然后用public的 getter/setter?
(答:控制访问、数据验证、隐藏实现)
好处
- 数据保护: 防止外部代码随意修改对象内部状态,保证数据的完整性和一致性。
- 隐藏复杂性: 使用者只需知道"做什么"(调用方法),无需知道"怎么做"(内部实现)。
- 易于修改: 内部实现改变时,只要接口不变,不影响外部调用者。
记忆点
**"黑盒子"**思想。对象像黑盒子,你按按钮(调用方法)得到结果,不用管里面电路(内部数据和方法)怎么工作的。
二、继承(Inheritance)——"子承父业,代码复用"
核心思想
- 允许一个类(子类/派生类)基于另一个类(父类/基类/超类)来创建。
- 子类自动获得父类的属性和方法(非
private)。 - 子类可以添加自己特有的属性和方法。
- 子类可以**重写(Override)**父类的方法,提供不同的实现。
- 目的: 实现代码复用,建立类之间的层次关系(IS-A 关系),支持多态。
Java 中的实现关键
- 关键字
extends:class SubClass extends SuperClass { ... } - 单继承: Java 类只能直接继承一个父类(不支持多继承,避免"菱形问题"歧义)。
super关键字:- 在子类中访问父类的成员(属性、方法)。
- 在子类构造器中调用父类构造器(
super(...)),必须放在子类构造器第一行。
- 方法重写(Override)规则:
- 子类提供与父类方法签名完全相同(方法名、参数列表、返回类型兼容)的方法实现。
@Override注解: 强烈建议使用,帮助编译器检查是否满足重写条件。- 访问权限不能比父类更严格;返回类型可以是父类返回类型的子类(协变返回类型);不能抛出比父类更宽泛的检查型异常。
final关键字:final class:不能被继承。final method:不能被子类重写。final variable:常量,值不能修改。
好处
- 代码复用: 避免重复编写公共代码。
- 扩展性: 子类可以在父类基础上添加新功能或修改行为。
- 层次结构: 清晰表达现实世界的分类关系(如
Animal->Dog、Cat)。
面试重点
- 继承 vs 组合: 什么时候用继承(IS-A)?什么时候用组合(HAS-A)?(组合通常更灵活,降低耦合)
- 构造器调用顺序: 创建子类对象时,先调用父类构造器,再调用子类构造器。
super和this的区别。
记忆点
"儿子继承爸爸的东西,还能有自己的特色和想法(重写)。"
三、多态(Polymorphism)——"同名异形,动态绑定"
核心思想
- "一个接口,多种实现"。
- 允许父类引用指向子类对象。
- 通过父类引用调用方法时,实际执行的是子类重写后的方法。
- 目的: 提高代码的灵活性、可扩展性和可维护性。是设计模式(如策略模式、工厂模式)的基础。
Java 中的实现关键
必要条件:
- 继承关系: 存在父类和子类。
- 方法重写: 子类重写了父类的方法。
- 向上转型(Upcasting): 父类引用指向子类对象(
Parent p = new Child();)。
动态绑定(后期绑定):
- 程序在**运行时(Runtime)**才确定调用哪个具体类的方法(根据引用实际指向的对象类型)。
- 与**静态绑定(前期绑定)**相对(如
private、final、static方法,以及构造器,在编译时确定)。
instanceof 运算符: 用于在运行时检查对象的实际类型(if (p instanceof Child) { ... })。
体现形式
- 方法重写(Override): 最常见的多态形式(运行时多态)。
- 方法重载(Overload): 编译时多态(静态绑定)。同一个类中,方法名相同但参数列表不同(个数、类型、顺序)。与多态(运行时)不同,但名字容易混淆,面试常考区别!
- 接口多态: 通过接口引用指向实现类对象(
Interface i = new ImplClass();),调用接口方法时执行实现类的方法。这是实现多态更灵活的方式(解耦)。
重载 vs 重写 区别表(必背!)
| 特性 | 方法重载(Overload) | 方法重写(Override) |
|---|---|---|
| 发生位置 | 同一个类 或 父子类 | 父子类 |
| 方法名 | 必须相同 | 必须相同 |
| 参数列表 | 必须不同(类型、个数、顺序) | 必须相同 |
| 返回类型 | 可以不同(但通常相同或兼容) | 必须兼容(相同或是其子类) |
| 访问权限 | 可以不同 | 不能比父类更严格 |
| 异常 | 可以不同 | 不能抛出更宽泛的检查型异常 |
| 绑定时机 | 编译时(静态绑定) | 运行时(动态绑定) |
| 目的 | 处理不同参数的同名操作 | 子类提供父类方法的不同实现 |
好处
- 可替换性: 程序可以无缝替换使用不同的子类对象。
- 可扩展性: 添加新的子类不影响基于父类接口编写的代码。
- 接口性: 基于父类/接口编程,降低模块间耦合度。
面试重点
- 多态的实现原理?(答:JVM 通过方法表 vtable 实现动态绑定)
- 编译时类型 vs 运行时类型?(答:
Parent p = new Child();编译时类型是Parent,运行时类型是Child) - 哪些方法不能被重写?(答:
private、final、static方法,构造器) - 重载和重写的区别?(务必清晰阐述上表内容)
记忆点
"父类遥控器,子类电视机。按同一个按钮(方法名),不同电视机(子类对象)显示不同节目(具体实现)。"
总结与面试应答技巧
- 结构化回答: 先总述三大特性名称,再分别详细解释每个特性(思想、实现、好处)。
- 强调关联: 说明继承是实现多态的基础,多态极大地提高了程序的灵活性。
- 举例说明: 结合简单易懂的例子(如动物类、图形类)。
- 区分重点:
- 封装:重点讲访问控制符和 getter/setter。
- 继承:重点讲
extends、super、方法重写规则、单继承。 - 多态:重中之重! 重点讲必要条件(继承 + 重写 + 向上转型)、动态绑定、重载与重写的区别。
- 延伸思考(加分项):
- 面向对象还有哪些重要概念?(抽象、接口、组合、聚合、关联、依赖等)
- 设计原则(如开闭原则、里氏替换原则)如何体现三大特性?(开闭依赖多态,里氏替换依赖继承和多态)
- 多态在框架(如 Spring IOC)中的应用?(依赖注入,面向接口编程)
终极记忆口诀
封:藏数据,露接口,权限控制保安全。
继:子承父,
extends连,复用扩展代码简。多:父引子,动态绑,重写同名效果变。
三大基石牢牢记,面向对象精髓现!

