Почему вызывается метод из класса A?

Рейтинг: 2Ответов: 1Опубликовано: 15.01.2015

Здравствуйте!

Объясните, пожалуйста, почему в данном коде вызывается метод из класса A, логично ведь, что должен вызваться B.

public class App2 {
    public static void main ( String[] args ) {
        A a = new B();
        a.method (2.0);
    }
}
class A{
    void method(Number n) {
        System.out.println ("Number");
    }
}

class B extends A{

    void method(Double a){
        System.out.println ("DOUBLE");
    }
}

Ответы

▲ 6Принят

ранние, позднее связывание?

Не в этом суть. Суть в том, что Java не поддерживает ковариантность аргументов при наследовании. Поскольку B наследует А, и Double наследует Number, метод method() в дочернем классе B не перекрывает родительский. В противном случае это нарушало бы принцип подстановки Барбары Лисков.

Представьте, что у вас есть еще класс C такого вида:

class С extends A{

    void method(Integer a){
        System.out.println ("INTEGER");
    }
}

Поскольку Integer унаследован от Number, такое объявление тоже было бы ковариантным по аргументу. Теперь мысленно попробуем выполнить код:

A a = new С();
a.method (2.0);

И тут бы возникла неувязка. С точки зрения класса А аргумент 2.0 адекватен, а с точки зрения класса С - нет. Поэтому для обеспечения безопасности типов Java не позволяет перекрывать родительские методы в дочерних классах таким образом.