Skip to content

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 的核心思想:用封装隐藏复杂性,用继承复用代码,用多态实现扩展。

理解了思想,才能在实际开发中灵活运用。

基于 VitePress 构建