在 Java 中,当一个类实现多个定义具有相同名称和方法的接口时,签名,问题就来了:哪个方法是重写?
根据Java语言规范(JLS),编译器会根据以下规则确定要重写的方法:
如果来自多个接口的继承方法具有相同的签名,则它们被视为“覆盖等效”(JLS 8.4.8.4)。因此,只需要实现一种方法即可。
示例:
public class Test实现 A, B { <br> public static void main(String... args) throws Exception{ <p>}</p><p>@Override<br> public int f() { // 来自哪个接口 A 或 B</p><pre class="brush:php;toolbar:false">return 0;
}
}
< ;/pre>
在这段代码中,类 Test 实现了接口 A 和 B,它们都有一个方法命名为 f() 具有相同的签名。由于这些方法是重写等效的,因此 Test.f() 重写哪个接口的 f() 方法并不重要。只需要一种实现,编译器不会区分两个接口。
这种行为扩展到继承和方法隐藏。如果接口方法与超类或另一个接口中的方法冲突,则冲突的方法必须重写等效才能使代码有效。
兼容性示例:
<br>公共接口礼物 { void 展示(); }<br>公共接口 Guest { void Present(); }<p>公共类 Presentable 实现 Gift、Guest { <br> @Override <br> public void Present() {</p><pre class="brush:php;toolbar:false">System.out.println("Heeeereee's Johnny!!!");
}
}
这里,Gift和Guest都有一个present()方法。 Presentable 类实现这两个接口并为present() 提供单一实现。编译器认识到这些方法是重写等效的,不需要单独实现。
不兼容性示例:
>;<br>公共接口 Gift { void Present(); }<br>公共接口 Guest { boolean Present(); }<p>public class Presentable Implements Gift, Guest { // 无法编译!!!<br> // 错误:Gift 和 Guest 类型不兼容<br>}<br>
在这种情况下,present() 方法的返回类型是不同的。根据 JLS 8.4.8.3,重写方法必须具有兼容的签名和返回类型。由于 Gift.present() 和 Guest.present() 没有兼容的返回类型,因此代码无法编译。
综上所述,当实现具有相同方法签名的多个接口时,编译器将将要重写的方法标识为与重写等效的方法。这意味着只需要一个方法实现,无论哪个接口定义该方法。
以上是Java 如何处理具有相同方法签名的多个接口?的详细内容。更多信息请关注PHP中文网其他相关文章!