Java闭包示例疑问:Callee2继承MyIncrement后为何无法为Incrementable重写increment()?
解释Java闭包示例中作者注释的真实含义
你没有误解“重写方法”这个动作本身,但作者的注释想表达的是另一个核心问题:无法用同一个increment()方法同时满足「继承自MyIncrement的重写需求」和「实现Incrementable接口的需求」,两者的语义场景是分离的,必须用内部类来提供独立的实现。
具体拆解:
首先看Callee2的双重角色:
- 作为
MyIncrement的子类,它需要重写increment(),以在调用MyIncrement.f(c2)时执行自定义逻辑(调用父类方法+自增i并打印)。 - 作为
Incrementable接口的实现提供者,它需要给Caller提供符合接口约定的increment()操作——这个操作的语义可能和子类重写的increment()不同(比如未来可能不需要调用父类的super.increment())。
- 作为
如果直接让
Callee2 implements Incrementable,那么它的increment()方法会同时承担两个职责:既是对父类MyIncrement方法的重写,又是对Incrementable接口的实现。这会导致两个场景的行为强绑定,无法单独修改某一个场景的逻辑。而代码中用内部类
Closure实现Incrementable的好处在于:- 把「给Caller用的Incrementable实现」和「子类重写MyIncrement的方法」分离开,两者的行为可以独立调整。比如现在
Closure的increment()调用了外部类的方法,但如果未来需要让Caller的调用不触发父类的super.increment(),只需要修改内部类的实现即可,不会影响MyIncrement.f(c2)的调用逻辑。
- 把「给Caller用的Incrementable实现」和「子类重写MyIncrement的方法」分离开,两者的行为可以独立调整。比如现在
作者的注释本质上是想强调:当一个类需要同时满足继承重写和接口实现的双重方法需求(即使签名相同),用内部类可以实现行为的解耦,避免单一方法承担多重语义导致的维护问题。
内容的提问来源于stack exchange,提问作者Lenny
相关产品推荐
相关产品推荐

