了解Java继承

alm*_*art 2 java compiler-construction polymorphism inheritance

给出以下Java代码:

class mainul {

    public static void main(String[] args) {

    /*block 1*/
        B b1 = new B();
        A a1 = b1;
        a1.m1(b1);

    /*block 2*/
        B b2 = new B();
        B a2 = b2;
        b2.m1(a2);
    }
}

class A {

    public static void p(Object o) {
        System.out.println(o.toString());
    }

    public void m1(A a) {
        p("m1(A) in A");

    }
}

class B extends A {

    public void m1(B b) {
        p("m1(B) in B");
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这个程序的输出是

m1(A) in A
m1(B) in B
Run Code Online (Sandbox Code Playgroud)

由于a1的动态类型是B,我们可以预期块1的输出为"m中的m1(B)".我注意到A和B中的函数签名对于m1不匹配(一个期望一个对象类型A和另一个B作为其参数)和A中的方法似乎获得优先级但不能真正将其链接到我的输出,因为它似乎与block2的输出不一致.

谢谢你的时间

Oli*_*rth 7

正如您所注意到的,B.m1(B)不会覆盖A.m1(A),因为它们采用不同的参数(尝试添加@Override注释,您将看到编译器抱怨).所以它永远不能通过引用来调用A.

但是,它可以通过引用来调用B.