栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?

如果一个类型实现两个接口,并且每个接口

interface
定义一个具有相同签名的方法,则实际上只有一个方法,并且它们是不可区分的。例如,如果这两个方法的返回类型冲突,那么它将是编译错误。这是继承,方法重写,隐藏和声明的一般规则,并且不仅适用于两个继承的interface方法之间的可能冲突,还适用于
an interface
super class
方法之间的冲突,甚至仅适用于泛型类型擦除引起的冲突。

相容性范例
在下面的示例中,你有一个

interface Gift
具有
present()
方法(例如,赠送礼物)的和
interface Guest
,还具有一种
present()
方法(例如,客人在场并且不在场)。

Presentable johnny
既是
Gift
Guest

public class InterfaceTest {    interface Gift  { void present(); }    interface Guest { void present(); }    interface Presentable extends Gift, Guest { }    public static void main(String[] args) {        Presentable johnny = new Presentable() { @Override public void present() {     System.out.println("Heeeereee's Johnny!!!"); }        };        johnny.present();          // "Heeeereee's Johnny!!!"        ((Gift) johnny).present(); // "Heeeereee's Johnny!!!"        ((Guest) johnny).present();// "Heeeereee's Johnny!!!"        Gift johnnyAsGift = (Gift) johnny;        johnnyAsGift.present();    // "Heeeereee's Johnny!!!"        Guest johnnyAsGuest = (Guest) johnny;        johnnyAsGuest.present();   // "Heeeereee's Johnny!!!"    }}

上面的代码片段将编译并运行。

请注意,只有一个 @Override 必要条件!!!。这是因为

Gift.present()
Guest.present()
是“- @Override等效的”(JLS 8.4.2)。

因此,

johnny
只有一个执行的
present()
,并不要紧,你如何对待
johnny
,无论是作为Gift或作为Guest,只有一个调用方法。

不兼容示例
这是两个不

@Override
等效的继承方法的示例:

public class InterfaceTest {    interface Gift  { void present(); }    interface Guest { boolean present(); }    interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!!    // "types InterfaceTest.Guest and InterfaceTest.Gift are incompatible;    //  both define present(), but with unrelated return types"}

这进一步重申,从

interface
必须继承成员必须遵守成员声明的一般规则。下面我们就Gift和Guest定义
present()
不兼容的返回类型:一个
void
其他的
boolean
。由于不能同时使用
an void
present()和
boolean present()in
的原因,此示例导致编译错误。

摘要
你可以继承

@Override-equivalent
的方法,但要遵循方法重写和隐藏的通常要求。由于它们是
@Override
等效的,因此实际上只有一种方法可以实现,因此没有区别/选择的地方。

编译器不必标识哪个方法用于哪个接口,因为一旦确定@Override它们等效,它们就是相同的方法。

解决潜在的不兼容性可能是一项艰巨的任务,但这是另一个问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431929.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号