题目重点:解释 Java 面向对象与多态,用接口调用不同实现,区分重载、重写与静态方法。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 讨论普通 Java 对象和实例方法;不要求某个 JVM 的对象布局。
- Java 有原始类型,因此面向对象不意味着每个值都是对象。
解题路线
- 先说封装、继承与多态分别解决状态边界、实现复用和行为替换,再用同一个接口的两个实现说明运行时分派。
- 实例方法的重写选择随对象实际类型变化;重载在编译时按可见类型与参数选择。静态方法隐藏和字段访问不能套用实例方法规则。
- 业务调用方依赖窄接口,例如 PaymentGateway.pay,而具体银行卡或钱包实现提供行为;构造时注入使测试替身与生产实现共享合同。
- 可替换还要求语义兼容:成功、重试、错误类型和副作用必须遵守接口承诺。否则只满足类型检查,依然破坏调用方。
手动走一遍
变量类型 Gateway,实际对象 WalletGateway,调用 pay 到钱包实现;把另一个实现注入后调用方代码不用改。重载 accept(Object) 与 accept(String) 时,静态类型 Object 的变量即使装着字符串,也优先选择 Object 签名。
规模与取舍
接口讨论没有统一算法复杂度;分派开销与 JIT 优化依赖实现。分析性能应测完整调用路径,不能承诺零开销。
易错点与追问
容易失分的边界
- 把重载当运行时多态。
- 为了复用一行代码建立深继承层次。
- 声称 Java 是纯面向对象而忽略原始类型。
继续深挖
- 为什么组合常比继承适合业务变化?
- 如何验证支付实现的可替换合同?
