Полиморфизм - это способность объектов разных классов работать с одной и той же функциональностью.
При выполнении операции A а = new B() происходит создание объекта класса B и его присваивание переменной "а" типа A. В данном случае "а" может быть любым абстрактным классом или интерфейсом.
1. Когда "А" - любой абстрактный класс:
Если "А" представляет собой абстрактный класс, то при создании объекта класса B будет вызван конструктор класса B. Далее, объект B будет присвоен переменной "а". Переменная "а" будет иметь тип "А" (так как она объявлена как объект класса "А"), но будет хранить объект класса B. В данной ситуации будет использоваться полиморфизм, так как объект B может работать с функциональностью, определенной в классе B, а также с функциональностью, определенной в абстрактном классе А.
2. Когда "А" - интерфейс, который реализует класс В:
Если "A" представляет собой интерфейс, который реализует класс B, то при создании объекта класса B будет вызван конструктор класса B. Далее, объект B будет присвоен переменной "а". Переменная "а" будет иметь тип "А" (так как она объявлена как объект интерфейса "А"), но будет хранить объект класса B. В данной ситуации также будет использоваться полиморфизм, так как объект B может работать с функциональностью, определенной в классе B, а также с функциональностью, определенной в интерфейсе А.
3. Когда "В" - интерфейс, который реализует класс А:
Если "В" представляет собой интерфейс, который реализует класс A, то при создании объекта класса B будет вызван конструктор класса B. Далее, объект B будет присвоен переменной "а". Переменная "а" будет иметь тип "А" (так как она объявлена как объект класса "А"), но будет хранить объект класса B. В данной ситуации также будет использоваться полиморфизм, так как объект B может работать с функциональностью, определенной в классе B, а также с функциональностью, определенной в классе А, так как класс B реализует интерфейс "В", который в свою очередь реализует класс А.
4. Когда "В" - любой абстрактный класс:
Если "В" представляет собой абстрактный класс, то при создании объекта класса B будет вызван конструктор класса B. Далее, объект B будет присвоен переменной "а". Переменная "а" будет иметь тип "А" (так как она объявлена как объект класса "А"), но будет хранить объект класса B. В данной ситуации также будет использоваться полиморфизм, так как объект B может работать с функциональностью, определенной в классе B, а также с функциональностью, определенной в абстрактном классе А.
Таким образом, полиморфизм сработает во всех вышеперечисленных случаях. При этом, объявление переменной "а" как объект класса "А" позволяет использовать только те методы и свойства, которые определены в классе или интерфейсе "A", даже если объект, который хранится в переменной "а", является объектом класса B или наследником класса B. Для доступа к функциональности, специфичной для класса B, необходимо будет выполнить приведение типов, например, ((B)а).methodB().