Логика перегрузки вызова метода Java - PullRequest
3 голосов
/ 05 января 2010

Для следующего кода, почему он печатает A, B? Я ожидал, что это напечатает B, B. Кроме того, выполняется ли вызов метода, выполняемый JVM, динамически или статически?

public class Main {
    class A {

    }

    class B extends A {

    }

    public void call(A a) {
        System.out.println("I'm A");
    }

    public void call(B a) {
        System.out.println("I'm B");
    }


    public static void main(String[] args) {

        Main m = new Main();
        m.runTest();
    }

    void runTest() {
        A a = new B();
        B b = new B();

        call(a);
        call(b);
    }

}

Ответы [ 3 ]

14 голосов
/ 05 января 2010

Перегрузка определяется статически компилятором. Переопределение выполняется во время выполнения, но здесь это не имеет значения.

Статический тип a равен A, поэтому первый вызов метода разрешается в call(A a).

3 голосов
/ 05 января 2010

Поскольку ваш объект известен по его типу A в этот момент, вызывается метод с аргументом A.Так что да, это определено статически .

Это для того, чтобы избежать двусмысленности.Ваш B также является A - но оба метода не могут быть вызваны одновременно.

1 голос
/ 05 января 2010

B является подклассом A. Поскольку вы создаете экземпляр B, но назначаете его переменной с типом A, все характеристики B будут потеряны, следовательно, call(a) будет отправлено в call(A, a) и выведет «A».

...