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;

}
}

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

相关文章
|
7天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
34 17
|
2天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
26 4
|
5天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
23 4
|
3天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
11 2
|
8天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
7天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
11 2
|
9天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
10天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
16 1
|
8天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
Java
JAVA方法的定义
JAVA方法的定义
80 0