繁体   English   中英

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

[英]How a java class can extend another class and implement interface same time with same method name

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

不,我创建了类A a = new C()的对象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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM