Skip to content

1. 封装、继承、多态


封装(Encapsulation)

一、是什么?

将数据和操作数据的方法捆绑为一个独立单元(类),通过访问控制隐藏内部细节。

二、解决什么问题

  1. 防止外部直接访问或修改敏感数据(如账户余额)
  2. 降低代码耦合性,内部逻辑修改不影响外部调用

三、核心实现方式

  • 使用 private 修饰属性
  • 提供 public 的 getter/setter 方法控制访问

四、应用场景

  • 实体类设计(如 User 类隐藏密码字段)
  • API接口设计(隐藏实现细节)

五、Java示例

java
public class BankAccount {
    private double balance; // 私有属性

    // 公共方法访问私有属性
    public double getBalance() {
        return balance; 
    }
    
    public void deposit(double amount) {
        if (amount > 0) balance += amount; // 封装校验逻辑
    }
}

六、重要注意事项

  • 避免过度暴露 setter,优先通过方法封装业务逻辑(如 deposit() 而非直接 setBalance()

继承(Inheritance)

一、是什么?

子类自动获得父类的属性和方法,实现代码复用和层次化扩展。

二、解决什么问题

  1. 消除重复代码(如多个类共有的 id 属性)
  2. 建立类之间的层次关系(如 Animal → Cat/Dog`)

三、核心语法

  • extends 关键字实现继承
  • 子类可重写父类方法(@Override

四、应用场景

  • 通用功能抽象(如基类 BaseEntity 包含 idcreateTime`)
  • 框架扩展(Spring 中 JpaRepository 继承)

五、Java示例

java
class Animal {
    void eat() { System.out.println("Eating..."); }
}

class Dog extends Animal { // 继承
    @Override
    void eat() { System.out.println("Dog eats bones"); } // 重写
}

六、重要注意事项

  • Java 是单继承(一个子类只能有一个父类)
  • 慎用继承,避免过度层级(优先使用组合替代继承)

多态(Polymorphism)

一、是什么?

同一操作作用于不同对象时产生不同行为,分为编译时多态(重载)和运行时多态(重写)。

二、解决什么问题

  1. 提高代码扩展性(新增子类不影响原有逻辑)
  2. 统一接口处理不同对象(如 Animal 调用 eat()`)

三、核心机制

  • 方法重写(Override)
  • 父类引用指向子类对象:Animal a = new Dog();

四、应用场景

  • 插件化架构(通过接口统一调用不同实现)
  • 集合操作:List<String> list = new ArrayList<>();

五、Java示例

java
Animal animal1 = new Dog();
Animal animal2 = new Cat();

animal1.eat(); // 输出 "Dog eats bones"(运行时绑定)
animal2.eat(); // 输出 "Cat eats fish"

六、重要注意事项

  • 多态调用方法时,编译看父类,运行看子类
  • 属性没有多态性(属性访问由引用类型决定)

三者的区别

特性核心目标关键操作典型场景
封装隐藏内部实现private属性 + getter实体类设计
继承代码复用extends + 重写方法构建类层次结构
多态灵活扩展行为父类引用指向子类对象统一接口处理不同子类

总结

  1. 封装是基础:保证对象的安全性和模块化
  2. 继承是手段:实现代码复用和层次化设计
  3. 多态是灵魂:通过动态绑定提升系统扩展性

三者协同工作:封装定义对象边界 → 继承构建关系 → 多态实现行为多样性。实际开发中,优先通过封装和组合设计类,谨慎使用继承,充分运用多态降低耦合。