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

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

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

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

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

例如:

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;

}
}

声明:地推任务网所有作品(图片、文字)均由用户自行上传分享,仅供网友学习交流。

相关文章
|
2天前
|
Java
java的类详解
在 Java 中,类是面向对象编程的核心概念,用于定义具有相似特性和行为的对象模板。以下是类的关键特性:唯一且遵循命名规则的类名;描述对象状态的私有属性;描述对象行为的方法,包括实例方法和静态方法;用于初始化对象的构造方法;通过封装保护内部属性;通过继承扩展其他类的功能;以及通过多态增强代码灵活性。下面是一个简单的 `Person` 类示例,展示了属性、构造方法、getter 和 setter 方法及行为方法的使用。
|
3天前
|
Java 数据库连接 数据库
Java服务提供接口(SPI)的设计与应用剖析
Java SPI提供了一种优雅的服务扩展和动态加载机制,使得Java应用程序可以轻松地扩展功能和替换组件。通过合理的设计与应用,SPI可以大大增强Java应用的灵活性和可扩展性。
22 11
|
6天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
7天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
4天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
10天前
|
Java
盘点java8 stream中隐藏的函数式接口
`shigen`是一位坚持更新文章的博客作者,记录成长历程,分享认知见解,留住感动瞬间。本文介绍了函数式接口的概念及其在Java中的应用,包括`Comparator`、`Runnable`、`Callable`等常见接口,并详细讲解了`Function`、`Predicate`、`Consumer`、`Supplier`和`Comparator`等函数式接口的使用方法及应用场景,展示了如何利用这些接口简化代码并提高编程效率。**个人IP:shigen**,与shigen一起,每天进步一点点!
23 0
盘点java8 stream中隐藏的函数式接口
|
2天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!
|
11天前
|
存储 Java
Java编程中的对象和类
在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章【8月更文挑战第31天】 将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
|
11天前
|
Java 开发者
探索Java中的Lambda表达式:简化代码的现代方法
【8月更文挑战第31天】Lambda表达式在Java 8中首次亮相,为Java开发者提供了一种更简洁、灵活的编程方式。它不仅减少了代码量,还提升了代码的可读性和可维护性。本文将通过实际示例,展示Lambda表达式如何简化集合操作和事件处理,同时探讨其对函数式编程范式的支持。