java类如何扩展另一个类并使用相同的方法名称同时实现接口

时间:2019-06-25 05:51:36

标签: java inheritance interface

我有一个interface(A)包含方法myMethod()和一个类(B)也包含相同的方法myMethod(),另一个类(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

3 个答案:

答案 0 :(得分:1)

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

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

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

(对于这两种方法,编译器还会记住,它们是实例方法,而不是静态方法,因此实际上有一个参数['this'对象]。但这只是在您稍后的内容中才有意义开发者的生命:))

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

答案 1 :(得分:0)

首先,它将在类C中寻找myMethod()的实现。由于它不在那里,它将检入扩展类B。然后,它将执行该类B myMethod()。但是,如果您在C类中实现了myMethod(),则您的程序将执行C类myMethod()。

答案 2 :(得分:0)

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