1. 面向对象的三大特性是什么?封装、继承、多态分别解决了什么问题?(面试官考核目标:考察对 OOP 本质的理解)
面向对象的三大特性:封装、继承、多态
一句话回答
- 封装:隐藏内部实现,只暴露稳定接口,解决“细节暴露、耦合、状态被随意修改”的问题。
- 继承:复用已有类并建立
is-a抽象层次,解决“共性代码重复、分类复用”的问题。 - 多态:同一接口在不同对象上有不同实现,解决“调用方依赖具体类型、扩展需修改旧代码”的问题。
本质:封装变化,继承/组合复用抽象,多态解耦扩展。
封装是基础,继承是手段之一,多态是面向接口编程的核心。
1. 封装
定义
把数据和对数据的操作放在同一个类中,隐藏内部状态和实现细节,只通过公开方法访问。
解决什么问题
- 防止外部随意修改内部状态,破坏对象的不变量。
- 降低调用方与实现细节之间的耦合。
- 便于在方法内部增加校验、日志、缓存、权限等逻辑。
- 支持实现变更:只要对外接口不变,内部可以重构。
例子
public class Account {
private BigDecimal balance;
public void withdraw(BigDecimal amount) {
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("金额必须大于0");
}
if (balance.compareTo(amount) < 0) {
throw new IllegalStateException("余额不足");
}
balance = balance.subtract(amount);
}
public BigDecimal getBalance() {
return balance;
}
}
本质
封装不是简单地把字段设为 private,再生成 getter/setter。
封装的本质是:隐藏变化点,对外提供稳定契约。
2. 继承
定义
子类继承父类的属性和方法,表达 is-a 关系,实现代码复用和抽象层次。
解决什么问题
- 多个类存在重复属性和行为时,可以抽取到父类。
- 建立分类体系,用父类类型统一处理一组子类。
- 子类可以扩展或重写父类行为。
例子
abstract class Animal {
abstract void makeSound();
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("汪汪");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("喵喵");
}
}
本质
继承是“复用 + 抽象”的手段,但会带来强耦合。
不要为了复用而滥用继承;实际开发中通常优先考虑组合优于继承。
继承更适合表达稳定的 is-a 关系。
3. 多态
定义
同一接口或父类引用,在不同对象上表现出不同行为。
运行时多态通常依赖“重写 + 动态绑定”。
解决什么问题
- 消除大量
if/else或switch类型判断。 - 调用方只依赖抽象,不依赖具体实现。
- 新增实现时尽量不修改旧代码,符合开闭原则。
- 实现可插拔、可替换。
例子
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.makeSound(); // 汪汪
a2.makeSound(); // 喵喵
调用方只写 animal.makeSound(),不需要知道具体是 Dog 还是 Cat。
本质
多态把“做什么”和“怎么做”解耦。
调用方规定协议,具体对象决定实现。
三者关系
| 特性 | 核心作用 | 解决的问题 | 关键词 |
|---|---|---|---|
| 封装 | 隐藏细节,暴露接口 | 耦合、状态被破坏、实现暴露 | 边界、契约、不变量 |
| 继承 | 复用与抽象 | 重复代码、分类层次 | is-a、父类、扩展 |
| 多态 | 统一接口,多种实现 | 类型判断、扩展困难、依赖具体 | 重写、动态绑定、面向接口 |
一句话串联:
封装建立边界,继承/组合复用抽象,多态基于统一接口实现可扩展和解耦。
面试口述版
面向对象三大特性是封装、继承、多态。
封装是把数据和操作数据的方法包在一起,隐藏内部实现,只暴露必要接口,解决的是耦合、数据安全和实现细节暴露的问题。
继承是子类复用父类的属性和方法,表达 is-a 关系,解决共性代码复用和抽象层次问题。但继承强耦合,实际开发中更推荐组合优于继承。
多态是同一接口在不同对象上有不同实现,通常通过重写和动态绑定实现,解决的是调用方依赖具体类型、新增类型要改旧代码的问题,让程序面向接口编程、更容易扩展。
三者关系上,封装是基础,继承/组合是复用手段,多态是解耦和扩展的核心。
常见追问
- 重载和重写:重载是编译时多态,重写是运行时多态。
- 多态实现机制:Java 通过虚方法表/动态分派,C++ 通过虚函数表。
- 封装不等于
getter/setter:暴露getter/setter也可能破坏封装。 - 继承的缺点:父类变化影响子类,破坏封装,耦合强;优先组合。
- 抽象类和接口:抽象类表达
is-a和代码复用,接口表达能力契约,更利于多态和解耦。

浙公网安备 33010602011771号