我有一个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
答案 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
的实现。