#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. тынц
Комментариев нет:
Отправить комментарий