Выполняя это упражнение на java, я не могу понять, почему в последней строке печатается цифра «5».

public class Customer { }

public class RegisteredCustomer extends Customer{}

public class Shop {
    public int computeDiscount(Customer c){return 0;}
}

public class OnlineShop extends Shop {
    public int computeDiscount(Customer c){return 5;}
    public int computeDiscount(RegisteredCustomer c){return 15;}
}


public class OnlinePremiumShop extends OnlineShop{
    public int computeDiscount(RegisteredCustomer c){return 20+super.computeDiscount(c);}
}


public static void main(String[] args) {
        RegisteredCustomer c3 = new RegisteredCustomer();
        Shop s2 = new OnlinePremiumShop();
        System.out.println(s2.computeDiscount(c3));
}

Почему java перехватывает метод с параметром Customer, если c3 является как динамическим, так и статическим типом RegisteredCustomer? Я думаю, что меня сбивает с толку привязка .. Каков процесс мышления, чтобы не ошибиться?

0
TmT123 27 Ноя 2021 в 11:08
Покажите, пожалуйста, метод main(), который используется в этом примере.
 – 
Code-Apprentice
27 Ноя 2021 в 11:10
Срай забыл @ Code-Apprentice
 – 
TmT123
27 Ноя 2021 в 11:15
s2 - это переменная типа Shop, которая имеет только один метод computeDiscount(Customer c), поэтому при вызове s2.computeDiscount(c3) можно выбрать только этот метод. Чего еще вы ожидали? Почему?
 – 
Pshemo
27 Ноя 2021 в 11:23
 – 
Pshemo
27 Ноя 2021 в 11:36

1 ответ

Лучший ответ
Shop s2 = new OnlinePremiumShop();

Здесь вы создаете объект OnlinePremiumShop и назначаете его ссылке типа Shop. В Shop объявлен единственный метод:

    public int computeDiscount(Customer c){return 0;}

Поэтому, когда вы вызываете s2.computeDiscount(), вы ДОЛЖНЫ вызывать тот, который принимает параметр Customer. Поскольку конкретный тип OnlinePremiumShop переопределяет этот метод, вызывается именно он, и в результате получается 5.

s2 не знает ни о какой версии computeDsicount(), которая принимает параметр RegisteredCustomer, поэтому он не может выполнить привязку к этой версии в дочернем классе.

0
Code-Apprentice 27 Ноя 2021 в 11:20