Страницы

Поиск по вопросам

четверг, 26 декабря 2019 г.

Полиморфизм и позднее связывание в Java

#java


У Эккеля есть замечательный пример полиморфизма:

class Super {
  public int field = 0;
  public int getField() { return field; }
}

class Sub extends Super {
  public int field = 1;
  @Override
  public int getField() { return field; }
  public int getSuperField() { return super.field; }
}

public class FieldAccess {
  public static void main(String[] args) {
    Super sup = new Sub(); // Upcast
    System.out.println("sup.field = " + sup.field +
      ", sup.getField() = " + sup.getField());
    Sub sub = new Sub();
    System.out.println("sub.field = " +
      sub.field + ", sub.getField() = " +
      sub.getField() +
      ", sub.getSuperField() = " +
      sub.getSuperField());
  }
}
/* Output:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField()
= 0
*/


Мы создаем объект подкласса и присваиваем его ссылке класса - родителя. И, вот тут:

//sup.field = 0, sup.getField() = 1


замечательно видно, что доступ непосредственно к полю осуществляется по ссылке, а
к методу - с помощью позднего связывания - по объекту.

Всё это серьёзно запутывает, так как часто на собеседованиях любят дать кусок кода
с кучей типов и подтипов, а лучше вложенных классов, и спрашивать методы из какого
класса по иерархии в каких случаях будут вызываться в рантайме.

Перечитав кучу информации по этому поводу, я так и не нашел стройной теории, о том,
когда происходит вызов метода/поля по типу ссылки, а когда по типу объекта. 

Прошу помощи.
    


Ответы

Ответ 1



Не очень понимаю что вызывает собственно говоря вопрос... В Java все нестатические методы виртуальные, то есть методы с одинаковой сигнатурой всегда перекрывают родительские методы, соответственно вызов конкретного метода идет по методу позднего связывания Доступ к членам класса избавлен от таких премудростей, доступ к члену класса идет напрямую (или если угодно по ссылке). Философически это означает, что полиморфизм в Java относится только к методам, но не к членам классов. runtime polymorphism can't be achieved by data members. тынц

Комментариев нет:

Отправить комментарий