Software Engineer · 语言与工程基础

Java 多态:运行时分派如何支持可替换的实现

解释 Java 面向对象与多态,用接口调用不同实现,区分重载、重写与静态方法。

题目重点:解释 Java 面向对象与多态,用接口调用不同实现,区分重载、重写与静态方法。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 讨论普通 Java 对象和实例方法;不要求某个 JVM 的对象布局。
  • Java 有原始类型,因此面向对象不意味着每个值都是对象。

解题路线

  1. 先说封装、继承与多态分别解决状态边界、实现复用和行为替换,再用同一个接口的两个实现说明运行时分派。
  2. 实例方法的重写选择随对象实际类型变化;重载在编译时按可见类型与参数选择。静态方法隐藏和字段访问不能套用实例方法规则。
  3. 业务调用方依赖窄接口,例如 PaymentGateway.pay,而具体银行卡或钱包实现提供行为;构造时注入使测试替身与生产实现共享合同。
  4. 可替换还要求语义兼容:成功、重试、错误类型和副作用必须遵守接口承诺。否则只满足类型检查,依然破坏调用方。

手动走一遍

变量类型 Gateway,实际对象 WalletGateway,调用 pay 到钱包实现;把另一个实现注入后调用方代码不用改。重载 accept(Object) 与 accept(String) 时,静态类型 Object 的变量即使装着字符串,也优先选择 Object 签名。

规模与取舍

接口讨论没有统一算法复杂度;分派开销与 JIT 优化依赖实现。分析性能应测完整调用路径,不能承诺零开销。

易错点与追问

容易失分的边界

  • 把重载当运行时多态。
  • 为了复用一行代码建立深继承层次。
  • 声称 Java 是纯面向对象而忽略原始类型。

继续深挖

  • 为什么组合常比继承适合业务变化?
  • 如何验证支付实现的可替换合同?
✓已复制微信号!