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

299
19 августа 2021, 10:10

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

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

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

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

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

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

Answer 1

Не очень понимаю что вызывает собственно говоря вопрос...

  1. В Java все нестатические методы виртуальные, то есть методы с одинаковой сигнатурой всегда перекрывают родительские методы, соответственно вызов конкретного метода идет по методу позднего связывания
  2. Доступ к членам класса избавлен от таких премудростей, доступ к члену класса идет напрямую (или если угодно по ссылке).

Философически это означает, что полиморфизм в Java относится только к методам, но не к членам классов.

runtime polymorphism can't be achieved by data members.

тынц

READ ALSO
Вытащить два первых символа из строки

Вытащить два первых символа из строки

Есть такая таблица в несколько колонок

102
Извлечь image из MultipartFile

Извлечь image из MultipartFile

Не подскажите как можно извлечь изображение которое храниться в MultipartFile?

181
Не удается получить результат с POST метода Java Spring

Не удается получить результат с POST метода Java Spring

Объект который хочу получить Rest сервисом

83