我理解Java多态性时遇到了一些麻烦

时间:2011-08-26 10:25:23

标签: java polymorphism static-methods

public class XXX {

    @Test
    public void test() {
        B b = new B();
        b.doY();
    }
}



class A {
    public void doY() {
        XProcedure.doX(this);
    }
}


class B extends A {

    public void doY() {
        super.doY();
        XProcedure.doX(this);
    }
}


class XProcedure {

    public static void doX(A a) {
        System.out.println("AAAA!");
    }

    public static void doX(B b) {
        System.out.println("BBBB!");
    }
}

输出

AAAA! BBBB!

我想知道为什么?

2 个答案:

答案 0 :(得分:3)

虽然XProcedure有两个同名的方法 - doX,但这两个签名是不同的。第一种方法获取类A的实例作为参数,第二种方法获取类B的实例。

当您调用XProcedure.doX(this)时,将根据传递的参数的类调用正确的方法。

“AAAA”!由于super.doY()电话打印 “BBBB!”由于XProcedure.doX(this);电话而打印。

由于Che的答案中的原因,

this在A的构造函数中与B的构造函数中的this不同。虽然A的构造函数是从B的构造函数中调用的,但在A的范围内,该实例属于A类。

答案 1 :(得分:1)

你打电话给super.doY这是B超级A的方法。

所有动物都可以说话。

猫是一种动物。

一只猫说话并喝牛奶。