У меня закончились проблемы с пониманием полиморфизма Java - PullRequest
0 голосов
/ 26 августа 2011
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!");
    }
}

Выход

АААА!BBBB!

И мне интересно, почему?

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Хотя в XProcedure есть два метода с одинаковым именем - doX, эти две сигнатуры различны. Первый метод получает экземпляр класса A в качестве параметра, а второй - экземпляр класса B.

Когда вы вызываете XProcedure.doX(this), вызывается правильный метод в соответствии с классом передаваемого параметра.

"АААА!" печатается из-за вызова super.doY().
"BBBB!" печатается из-за вызова XProcedure.doX(this);.

this отличается в конструкторе A от this в конструкторе B по причинам, указанным в ответе Че. Хотя конструктор A вызывается из конструктора B, в области видимости A экземпляр имеет класс A.

1 голос
/ 26 августа 2011

Вы назвали super.doY, который является методом для суперкласса B.

Все животные могут разговаривать.

Кошка - это животное.

Кошка разговаривает ипьет молоко.

...