OOP三大特性
一、封装(Encapsulation)
1. 含义
- 将属性和方法打包在一个类中,并通过访问修饰符控制外部访问。
- 目的:隐藏实现细节,暴露必要接口,保证数据安全和可控。
2. 实现方式
- 使用 private 修饰属性,只能在类内部访问。
- 提供 public 的 getter/setter 作为访问入口。
- 还可以结合 protected 和 default 来控制包内/子类访问。
public class BankAccount {private double balance; // 封装,不允许外部直接改public double getBalance() {return balance;}public void deposit(double amount) {if(amount > 0) balance += amount;}
}
3. 项目中的应用
- 数据保护:比如用户密码字段必须加密存储,不允许通过 getter 返回明文。
- 服务调用约束:只暴露对外的 API(Controller 层),内部实现隐藏在 Service/DAO 中。
- 安全控制:Web 项目里 VO/DTO 层经常只提供部分字段,避免暴露敏感信息。
4. 优势
- 提高代码的 安全性 和 可维护性。
- 降低模块之间的耦合度(调用者只需关心接口,不需要关心内部逻辑)。
二、继承(Inheritance)
1. 含义
- 子类继承父类的属性和方法,实现代码复用。
- Java 中使用 extends(类)和 implements(接口)。
2. 实现方式
- 一个类可以继承一个父类(单继承)。
- 可以实现多个接口(多实现)。
// 父类
public class Vehicle {public void run() { System.out.println("Vehicle is running..."); }
}// 子类
public class Car extends Vehicle {public void run() { System.out.println("Car is running..."); }
}
3. 项目中的应用
- 公共逻辑抽取: 比如 BaseEntity(包含 id、createTime、updateTime),所有数据库实体类都继承它。
- 控制层复用:BaseController 定义通用的返回值方法,子类 Controller 继承。
- 模板方法模式: 父类定义流程,子类定义具体实现(例如 Spring 的 AbstractApplicationContext)。
4. 优势
- 提高 代码复用性。
- 便于建立层次结构,符合人类认知。
- 缺点:继承层次过深可能导致结构复杂、难以维护(所以常配合组合/接口使用)。
三、多态(Polymorphism)
1. 含义
- 同一接口,调用不同的实现类,表现出不同的行为。
- 分为两种:
- 编译时多态(方法重载 Overload)。
- 运行时多态(方法重写 Override)。
2. 实现方式
- 方法重载(Overload):同一个类里方法名相同、参数不同。
- 方法重写(Override):子类对父类的方法进行覆盖。
- 父类引用指向子类对象,调用时执行的是子类方法。
class Animal {void speak() { System.out.println("Animal speaks"); }
}
class Dog extends Animal {@Overridevoid speak() { System.out.println("Dog barks"); }
}
class Cat extends Animal {@Overridevoid speak() { System.out.println("Cat meows"); }
}// 调用
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.speak(); // Dog barks
a2.speak(); // Cat meows
3. 项目中的应用
- 接口编程(Spring 最常见):
@Autowired
private UserService userService; // 接口
// 运行时可能注入 UserServiceImpl 或者 MockUserServiceImpl
- 策略模式:支付系统里有 AliPayService、WeChatPayService,统一接口 PayService。
- 模板方法模式:父类定义流程,子类覆盖不同步骤。
- 集合框架:List list = new ArrayList(); 运行时多态让我们面向接口编程。
4. 优势
- 解耦:调用方不关心实现细节,只关心接口。
- 扩展性强:新增实现类时,只需实现接口即可,无需修改调用方。
- 利于设计模式:大部分设计模式(策略、工厂、模板方法)都是基于多态。
四、对比
特性 | 定义 | 关键点 | 项目应用 | 优势 |
封装 | 隐藏内部细节,仅对外暴露接口 | private 属性 + public 方法 | DTO/VO、安全控制、统一 API | 安全、降低耦合 |
继承 | 子类复用父类的属性和方法 | extends 、 implements | BaseEntity、BaseController、模板方法模式 | 代码复用、结构清晰 |
多态 | 同一接口不同实现,运行时表现不同 | 方法重写、父类引用指向子类对象 | 接口编程、Spring IOC、策略模式 | 扩展性强、利于解耦 |
在实际项目里:
- 封装用来控制访问,保证安全;
- 继承用来抽取公共逻辑,减少重复代码;
- 多态用来实现灵活扩展,是设计模式的基础。