MST

星途 面试题库

面试题:Java 继承体系下违背里氏替换原则的案例分析

假设你有一个 Java 类继承体系,父类 A 有一个方法 `void operation()`,子类 B 继承自 A 并覆盖了 `operation()` 方法。请构造一个场景,使得子类 B 对 `operation()` 方法的重写违背了里氏替换原则,并详细分析违背的原因以及可能带来的问题。
11.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 构造违背里氏替换原则的场景
    • 定义父类 A
class A {
    public void operation() {
        System.out.println("父类A的operation方法,进行一些常规操作");
    }
}
  • 定义子类 B,重写 operation() 方法,但违背里氏替换原则:
class B extends A {
    @Override
    public void operation() {
        throw new RuntimeException("子类B的operation方法抛出异常,不执行常规操作");
    }
}
  1. 分析违背原因
    • 里氏替换原则要求,在软件系统中,所有引用基类(父类)的地方必须能透明地使用其子类的对象。在这个场景中,当代码依赖于父类 Aoperation() 方法的正常行为时,例如:
public class Main {
    public static void process(A a) {
        a.operation();
    }

    public static void main(String[] args) {
        A a = new A();
        process(a);
        a = new B();
        process(a);
    }
}
  • process 方法中传入的是父类 A 的对象时,operation 方法正常执行。但当传入子类 B 的对象时,由于子类 Boperation 方法抛出异常,这就打破了父类 Aoperation 方法原本的行为契约,不能像预期那样透明地替换使用,从而违背了里氏替换原则。
  1. 可能带来的问题
    • 代码健壮性降低:依赖父类 Aoperation 方法的代码在运行时可能因为传入子类 B 的对象而抛出异常,导致程序崩溃,影响系统的稳定性。
    • 维护困难:如果代码中多处依赖父类 Aoperation 方法,当引入子类 B 违背里氏替换原则时,很难快速定位问题,因为调用处可能离实际抛出异常的子类 Boperation 方法很远,增加了调试和维护的成本。
    • 可扩展性受限:后续基于父类 A 进行扩展的功能可能因为子类 B 的特殊行为而变得不可靠,阻碍了软件系统的正常扩展。