为何Java代码返回接口默认方法值而非重写方法的结果?
问题分析与解答
你的代码执行结果为0的原因
你写的MyInterface a = () -> someMethod();这一行,是用Lambda表达式创建了一个独立的MyInterface实现实例,和当前Test类的实例没有任何关联:
- MyInterface里只有
anotherMethod()是抽象方法,所以这个Lambda的作用就是实现anotherMethod(),它的逻辑是返回someMethod()的结果。 - 这里的
someMethod()调用的是MyInterface接口的默认方法(返回0),因为Lambda实例并没有继承Test类的实现——Test类对anotherMethod()的重写只属于Test自己的实例,和这个Lambda创建的实例完全无关。
因此调用a.anotherMethod()时,执行的是Lambda里的逻辑:返回接口默认someMethod()的结果0,所以输出是0。
如何得到预期的结果1
如果你想让输出为1,有两种可行的修改方式:
- 复用当前Test类的实例
因为Test类已经实现了MyInterface并正确重写了anotherMethod(),直接把当前实例赋值给a即可:void run() { MyInterface a = this; System.out.println(a.anotherMethod()); } - 让Lambda调用Test类的重写方法
修改Lambda的逻辑,让它调用当前Test实例的anotherMethod():
这里的void run() { MyInterface a = () -> anotherMethod(); System.out.println(a.anotherMethod()); }anotherMethod()会指向Test类中重写的版本,返回1。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

