【问题标题】:How a java class can extend another class and implement interface same time with same method namejava 类如何以相同的方法名扩展另一个类并同时实现接口
【发布时间】:2019-06-25 05:51:36
【问题描述】:

我有一个 interface(A) 包含方法 myMethod() 和一个 class(B) 也包含相同的方法 myMethod() 和另一个 class(c) 扩展并实现 A 和 B。

不,我创建了A a = new C() 类的对象并调用了a.myMethod();

它是如何执行 B 类的 myMethod 的。

interface A {
    void myMethod();
}

class B {
    public void myMethod() {
        System.out.println("My Method");
    }
}

class C extends B implements A {

}

class MainClass {
    public static void main(String[] args) {
        A a = new C();
        a.myMethod();
    }
}

程序的输出 -

 My Method

【问题讨论】:

  • 为什么这会让您感到惊讶?你期望结果是什么?
  • @BoristheSpider 我只是想知道它背后的概念。我不太了解 OOP 的概念。
  • 您需要class 有一个与interface 中的签名匹配的方法,然后您指示同一个类应该从提供这种方法的class 继承。我不确定你的问题是什么。我可以建议阅读有关继承基础知识的tutorial 吗?
  • 这样想,方法myMethod也在C中,因为C继承了B
  • 这不是一个坏问题,我认为这在 C# 中的处理方式不同。 stackoverflow.com/q/2371178/14955

标签: java inheritance interface


【解决方案1】:

首先它将在 C 类中查找 myMethod() 的实现。因为它不存在,所以它将检查您的扩展类 B。然后它将执行该 B 类 myMethod()。但是如果你在 C 类中实现了 myMethod(),你的程序将执行 C 类的 myMethod()。

【讨论】:

    【解决方案2】:

    这些方法具有相同的签名。这意味着,在所有类型都被简化为最紧凑的形式之后,这些方法看起来是一样的,并且在编译期间所有(看似)冗余信息都已被删除。这是最终“预编译”到.class 文件的内容。

    编译器对接口方法的记忆: name: myMethod, returns: void, parameters: {}

    编译器对接口方法的记忆: name: myMethod, returns: void, parameters: {}

    (对于这两种方法,编译器还记得,它们是实例方法,而不是静态方法,因此实际上有一个参数 ['this' 对象]。但这只是在你的后面很有趣开发者生活:))

    所以本质上,对于编译器来说,它们是相同的方法。 换句话说,您扩展的类为您覆盖了该方法,您不必显式地实现它。但是,如果需要,您可以(如果您愿意)覆盖扩展类 B 的行为并执行其他操作。

    【讨论】:

    • @Thilo 是的。我在这里应用了太多信息:)
    • @BoristheSpider 但它并没有错,只是信息太多。剩下的签名仍然是擦除签名,无论是否删除了泛型。但是这里有点混乱,所以我删除了它。
    【解决方案3】:

    执行的方法取决于对象的类型而不是变量(多态性)。在您的情况下,对象是 C 类型,它从 B 类型继承 myMethod 的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2012-10-13
      • 2014-10-25
      相关资源
      最近更新 更多