是什么使这些方法调用返回这些值?

时间:2019-01-29 10:01:06

标签: java inheritance interface

我需要写出这些方法调用的输出。

我的回答是:

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)方法。

1 个答案:

答案 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”