我需要写出这些方法调用的输出。
我的回答是:
I i = new A();
i.m(b);
我的答案:m_IB是因为我没有类型为 B 的任何方法,所以我下到了实现< strong>我。 A 也没有任何带有参数 B 的方法,但它扩展了 I.IImpl ,其中具有打印m(B b)的方法m_IB。
I j = new B();
j.m(b);
我的答案:m_BB又一次是因为我我没有使用 B 类型的任何方法,所以我选择了 B类,因为< strong> I j = new B(),它的am(B b)打印m_BB。
interface I {
public void m(A a);
class IImpl {
public static void m(B b) { System.out.println("m_IB"); }
}
}
class A extends I.IImpl implements I {
public void m(A a) { System.out.println("m_AA"); }
}
class B extends A {
public void m(A a) {
super.m(a);
System.out.println("m_BA");
}
public static void m(B b) { System.out.println("m_BB"); }
}
public class Interfac {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.m(b); System.out.println(); // m_IB
I i = new A();
i.m(b); System.out.println(); // m_AA
I j = new B();j.m(b); // m_AA m_BA
}
}
我的两个答案都是错误的,正确的输出是 i 的m_AA和 j 的m_AA m_BA。 即使我正在调用类型B的方法,我也无法理解为什么得到此输出。 两种正确答案都在调用m(A a)方法。
答案 0 :(得分:1)
您的界面提供了此方法:
public void m(A a);
您的j
的声明如下:
I j = new B();
是的,它是B
的实例,但是它被声明为I
,这意味着,当您调用该方法时,它将调用接口提供的方法,而不是重载的方法。
因此,在类B
中,它采用了接口提供的方法:
public void m(A a) { // this one
super.m(a);
System.out.println("m_BA");
}
// not this overloaded one
public static void m(B b) { System.out.println("m_BB"); }
该方法的第一行是:
super.m(a);
在m(a)
类中调用A
方法,然后打印:“ m_AA”。
然后,它会打印“ m_BA”