【发布时间】:2019-01-29 10:01:06
【问题描述】:
我需要写出这些方法调用的输出。
我的回答是:
I i = new A();
i.m(b);
我的回答:m_IB,因为 我 没有任何具有 B 类型的方法,所以我去了 class A,它实现了 我。 A 也没有任何带有参数 B 的方法,但它扩展了 I.IImpl,它有一个带有 m(B b) 的方法,可以打印m_IB。
I j = new B();
j.m(b);
我的回答:m_BB 因为再次我没有任何 B 类型的方法,所以我去了 B 类 因为 I j = new B(),它有一个打印 m_BB 的 m(B b)。
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) 方法。
【问题讨论】:
-
你怎么看 super.m(a);有吗?
-
面试题?
-
@Stultuske 我知道 super.m(a) 做了什么,但我的问题是我不知道我实际上调用的是接口提供的方法而不是重载的方法。
-
@CommonMan 不!它来自 Java 编程考试!
标签: java inheritance interface