OOP 面试题:不是背概念,是理解思想
OOP 的四大特性:封装、继承、多态、抽象。
大多数人都能背出来,但面试官接着问:封装解决了什么问题?你在项目里怎么用的多态? 很多人就卡住了。
四大特性不是目的,是手段
学 OOP 不是为了用这四个特性,而是为了写出高内聚、低耦合的代码。
封装:隐藏复杂性
java
// ❌ 暴露细节
public class User {
public String name; // 直接 public
}
// ✅ 封装
public class User {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
// 好处:可以加校验逻辑、可以在取值/赋值时做额外处理
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
this.name = name.trim();
}继承:复用代码
java
// 继承
public class Animal {
public void eat() { }
}
public class Dog extends Animal {
@Override
public void eat() { System.out.println("狗吃狗粮"); }
}但继承也有问题:子类和父类耦合太紧,父类一变子类可能全要改。所以有了组合优于继承的原则。
多态:同一接口,不同表现
java
// 接口:定义行为
interface Shape {
double area();
}
// 实现:同一接口,不同表现
class Circle implements Shape {
private double radius;
public double area() { return Math.PI * radius * radius; }
}
class Rectangle implements Shape {
private double width, height;
public double area() { return width * height; }
}
// 调用方不需要知道具体实现
double totalArea(List<Shape> shapes) {
return shapes.stream()
.mapToDouble(Shape::area)
.sum();
}抽象:提取共性
java
// 抽象类:提取公共行为
abstract class Animal {
abstract void eat();
void sleep() { System.out.println("动物睡觉"); } // 公共实现
}设计原则:SOLID
| 原则 | 含义 | 核心问题 |
|---|---|---|
| S:单一职责 | 一个类只做一件事 | 避免上帝类 |
| O:开闭原则 | 对扩展开放,对修改封闭 | 改需求时要改很多类 |
| L:里氏替换 | 子类可以替换父类 | 违反这个会导致大量 instanceof 判断 |
| I:接口隔离 | 接口要小而专 | 一个大接口不如多个小接口 |
| D:依赖倒置 | 依赖抽象而非具体 | 具体类一变,依赖它的类全要改 |
总结
OOP 的核心思想:用封装隐藏复杂性,用继承复用代码,用多态实现扩展。
理解了思想,才能在实际开发中灵活运用。
