当前位置: 首页 > 面试题库 >

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

陆臻
2023-03-14
问题内容

具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何确定哪个方法用于哪个接口?

例如:

interface A{
  int f();
}

interface B{
  int f();
}

class Test implements A, B{   
  public static void main(String... args) throws Exception{   

  }

  @Override
  public int f() {  // from which interface A or B
    return 0;
  }
}  

问题答案:

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

相容性范例
在下面的示例中,你有一个interface Gift具有present()方法(例如,赠送礼物)的和interface Guest,还具有一种present()方法(例如,客人在场并且不在场)。

Presentable johnny既是GiftGuest

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它们等效,它们就是相同的方法。

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



 类似资料:
  • 问题内容: 此代码完美地工作。方法test()适用于两个接口。幕后到底发生了什么?在实际情况下,此功能有何用处? 问题答案: 因为它是一个接口,所以不会造成任何危害。通过实现和,您基本上是在为您的课程使用蓝图。双方并说,应实施一个名为方法 您的类实现了该方法,因此接口已完成其工作。 基本上,您的班级在说:“哦,我需要因为接口而实现”,然后您就实现了。然后您的班级说:“哦,嘿,由于接口我需要再次实现

  • 问题内容: 我有两个Java接口和一个实现类。 (我已经使用Eclipse直接运行程序,并且我没有尝试通过从命令行进行显式编译来检查任何编译器警告等)。 为什么它们运行没有问题?为什么Java允许这样做,即使它满足两个接口的“合同”,却在实现类时造成歧义? 更新了示例。 问题答案: Java语言规范的第8.1.5节专门允许这种情况: 类中的单个方法声明可以实现多个超级接口的方法。例如,在代码中:

  • 本文向大家介绍解决Kotlin 类在实现多个接口,覆写多个接口中相同方法冲突的问题,包括了解决Kotlin 类在实现多个接口,覆写多个接口中相同方法冲突的问题的使用技巧和注意事项,需要的朋友参考一下 一、首先来看一个例子 二、解决冲突的例子 补充知识:Kotlin 如何优雅的实现『多继承』 这一期给大家讲一个有意思的东西。我们都知道 Java 当年高调的调戏 C++ 的时候,除了最爱说的内存自动回

  • 我有一个生产者,它获取数据A,产生数据B,并将其发送出去 为了证明我的问题,想象一下我有像上面这样的制作人。一个加载所有数据,然后在完成后立即批量发送,第二个立即发送数据(因此它不批量发送数据,但每当有新数据时,createdit立即发送) 大多数生产者会在每加载一个数据之后发送数据,但很少有人会马上发送。如果生产者立即发送数据,则方法将保持为空。然而,这似乎是一种糟糕的做法,可能违反了一些OOP

  • 问题内容: 为什么必须重写接口的所有方法? 例如,如果我有 我将有很多我什至不会使用的方法,有没有一种方法可以删除未使用的实现方法,例如,如果 我计划从接口中使用一种方法 我也不想使用抽象,因为这意味着我无法创建对象的实例(至少我的编译器这样说) 问题答案: 具体的类必须始终实现接口的所有方法。如果您还没有扩展,可以扩展。它实现了空方法,以避免将其写出来。您可以在类内部使用匿名类,如下所示:

  • 问题内容: 说我有两个结构: 我希望他们都实现接口A: 像这样对First和Second结构都实现似乎是多余的: 有没有一种方法可以为实现接口A的所有结构提供一个实现?像这样的东西,但似乎不起作用: 谢谢! 问题答案: 不,您不能, 但是 您可以创建一个基本类型,然后将其嵌入到您的2结构中,因此只需要一个基本类型的实现即可: 用法: 操场上的完整例子 嵌入文件