RHODES ISLAND // PERSONAL ARCHIVE

关之水瑶 · 作战记录

记录技术、生活与正在进行的思考。欢迎来到我的个人情报终端。

SYSTEM ONLINE / 2026

1. 面向对象的三大特性是什么?封装、继承、多态分别解决了什么问题?(面试官考核目标:考察对 OOP 本质的理解)

面向对象的三大特性:封装、继承、多态

一句话回答

  • 封装:隐藏内部实现,只暴露稳定接口,解决“细节暴露、耦合、状态被随意修改”的问题。
  • 继承:复用已有类并建立 is-a 抽象层次,解决“共性代码重复、分类复用”的问题。
  • 多态:同一接口在不同对象上有不同实现,解决“调用方依赖具体类型、扩展需修改旧代码”的问题。

本质:封装变化,继承/组合复用抽象,多态解耦扩展。
封装是基础,继承是手段之一,多态是面向接口编程的核心。


1. 封装

定义

把数据和对数据的操作放在同一个类中,隐藏内部状态和实现细节,只通过公开方法访问。

解决什么问题

  1. 防止外部随意修改内部状态,破坏对象的不变量。
  2. 降低调用方与实现细节之间的耦合。
  3. 便于在方法内部增加校验、日志、缓存、权限等逻辑。
  4. 支持实现变更:只要对外接口不变,内部可以重构。

例子

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 关系,实现代码复用和抽象层次。

解决什么问题

  1. 多个类存在重复属性和行为时,可以抽取到父类。
  2. 建立分类体系,用父类类型统一处理一组子类。
  3. 子类可以扩展或重写父类行为。

例子

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. 多态

定义

同一接口或父类引用,在不同对象上表现出不同行为。
运行时多态通常依赖“重写 + 动态绑定”。

解决什么问题

  1. 消除大量 if/else 或 switch 类型判断。
  2. 调用方只依赖抽象,不依赖具体实现。
  3. 新增实现时尽量不修改旧代码,符合开闭原则。
  4. 实现可插拔、可替换。

例子

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 和代码复用,接口表达能力契约,更利于多态和解耦。
posted @ 2026-09-24 17:10  关之水瑶  阅读(20)  评论(0)    收藏  举报