홈으로 돌아가기

Java 三大特性:封装、继承、多态

420 3 2026-08-17编程开发 › Java 基础#Java#OOP#Encapsulation#Inheritance#Polymorphism#Interview

面向对象三大特性的核心思想与 Java 实现关键:封装的访问控制与 getter/setter、继承的 extends/super/重写规则、多态的动态绑定与重载重写区别,附面试重点与记忆口诀。

一、封装(Encapsulation)——"黑箱操作,安全第一"

核心思想

  • 将对象的**属性(数据)操作这些属性的方法(行为)**捆绑在一起,形成一个独立的单元(即"对象")。
  • 将对象的内部实现细节隐藏起来,只对外暴露**有限的、必要的接口(方法)**供其他对象访问。
  • 目的: 提高安全性、降低耦合度、增强可维护性。

Java 中的实现关键

访问权限修饰符(Access Modifiers):

修饰符可见范围说明
private仅本类内部可见最严格的封装
protected本类、同包类、不同包子类可见常用于继承体系
default(不写修饰符)仅同包类可见包私有
public所有地方可见最开放的封装

Getter / Setter 方法:

  • 提供 publicgetXxx() 方法来安全地获取 private 属性的值。
  • 提供 publicsetXxx() 方法来安全地设置 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 -> DogCat)。

面试重点

  • 继承 vs 组合: 什么时候用继承(IS-A)?什么时候用组合(HAS-A)?(组合通常更灵活,降低耦合)
  • 构造器调用顺序: 创建子类对象时,先调用父类构造器,再调用子类构造器。
  • superthis 的区别。

记忆点

"儿子继承爸爸的东西,还能有自己的特色和想法(重写)。"

三、多态(Polymorphism)——"同名异形,动态绑定"

核心思想

  • "一个接口,多种实现"。
  • 允许父类引用指向子类对象
  • 通过父类引用调用方法时,实际执行的是子类重写后的方法
  • 目的: 提高代码的灵活性、可扩展性和可维护性。是设计模式(如策略模式、工厂模式)的基础。

Java 中的实现关键

必要条件:

  1. 继承关系: 存在父类和子类。
  2. 方法重写: 子类重写了父类的方法。
  3. 向上转型(Upcasting): 父类引用指向子类对象(Parent p = new Child();)。

动态绑定(后期绑定):

  • 程序在**运行时(Runtime)**才确定调用哪个具体类的方法(根据引用实际指向的对象类型)。
  • 与**静态绑定(前期绑定)**相对(如 privatefinalstatic 方法,以及构造器,在编译时确定)。

instanceof 运算符: 用于在运行时检查对象的实际类型(if (p instanceof Child) { ... })。

体现形式

  • 方法重写(Override): 最常见的多态形式(运行时多态)。
  • 方法重载(Overload): 编译时多态(静态绑定)。同一个类中,方法名相同但参数列表不同(个数、类型、顺序)。与多态(运行时)不同,但名字容易混淆,面试常考区别!
  • 接口多态: 通过接口引用指向实现类对象(Interface i = new ImplClass();),调用接口方法时执行实现类的方法。这是实现多态更灵活的方式(解耦)。

重载 vs 重写 区别表(必背!)

特性方法重载(Overload)方法重写(Override)
发生位置同一个类 或 父子类父子类
方法名必须相同必须相同
参数列表必须不同(类型、个数、顺序)必须相同
返回类型可以不同(但通常相同或兼容)必须兼容(相同或是其子类)
访问权限可以不同不能比父类更严格
异常可以不同不能抛出更宽泛的检查型异常
绑定时机编译时(静态绑定)运行时(动态绑定)
目的处理不同参数的同名操作子类提供父类方法的不同实现

好处

  • 可替换性: 程序可以无缝替换使用不同的子类对象。
  • 可扩展性: 添加新的子类不影响基于父类接口编写的代码。
  • 接口性: 基于父类/接口编程,降低模块间耦合度。

面试重点

  • 多态的实现原理?(答:JVM 通过方法表 vtable 实现动态绑定)
  • 编译时类型 vs 运行时类型?(答:Parent p = new Child(); 编译时类型是 Parent,运行时类型是 Child
  • 哪些方法不能被重写?(答:privatefinalstatic 方法,构造器)
  • 重载和重写的区别?(务必清晰阐述上表内容)

记忆点

"父类遥控器,子类电视机。按同一个按钮(方法名),不同电视机(子类对象)显示不同节目(具体实现)。"

总结与面试应答技巧

  1. 结构化回答: 先总述三大特性名称,再分别详细解释每个特性(思想、实现、好处)。
  2. 强调关联: 说明继承是实现多态的基础,多态极大地提高了程序的灵活性。
  3. 举例说明: 结合简单易懂的例子(如动物类、图形类)。
  4. 区分重点:
    • 封装:重点讲访问控制符和 getter/setter。
    • 继承:重点讲 extendssuper、方法重写规则、单继承。
    • 多态:重中之重! 重点讲必要条件(继承 + 重写 + 向上转型)、动态绑定、重载与重写的区别。
  5. 延伸思考(加分项):
    • 面向对象还有哪些重要概念?(抽象、接口、组合、聚合、关联、依赖等)
    • 设计原则(如开闭原则、里氏替换原则)如何体现三大特性?(开闭依赖多态,里氏替换依赖继承和多态)
    • 多态在框架(如 Spring IOC)中的应用?(依赖注入,面向接口编程)

终极记忆口诀

:藏数据,露接口,权限控制保安全。

:子承父,extends 连,复用扩展代码简。

:父引子,动态绑,重写同名效果变。

三大基石牢牢记,面向对象精髓现!

正在初始化...
Java 三大特性:封装、继承、多态 | WitchCat