У Эккеля есть замечательный пример полиморфизма:
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
замечательно видно, что доступ непосредственно к полю осуществляется по ссылке, а к методу - с помощью позднего связывания - по объекту.
Всё это серьёзно запутывает, так как часто на собеседованиях любят дать кусок кода с кучей типов и подтипов, а лучше вложенных классов, и спрашивать методы из какого класса по иерархии в каких случаях будут вызываться в рантайме.
Перечитав кучу информации по этому поводу, я так и не нашел стройной теории, о том, когда происходит вызов метода/поля по типу ссылки, а когда по типу объекта.
Прошу помощи.
Не очень понимаю что вызывает собственно говоря вопрос...
Философически это означает, что полиморфизм в Java относится только к методам, но не к членам классов.
runtime polymorphism can't be achieved by data members.
тынц
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Не подскажите как можно извлечь изображение которое храниться в MultipartFile?
Объект который хочу получить Rest сервисом