26

Помогите, пожалуйста, с теорией. Можно и практические примеры.

Разбирал this и super. Что я понял: this - это ссылка на самого себя. То есть я не могу из другого класса обращаться через this. Если пропишу в другом классе, то получу еще одну ссылку на класс, но не другой, а снова себя.

А super - это получение методов предка, но только последнего, а не предка его предка. Так ли это? Или я где-то недопонял?

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
elik
  • 5,658

3 Answers3

20

this - это ты. super - это твоя мамка. Если ты говоришь this и super ты имеешь в виду себя и свою мамку. Если я говорю this и super - я указываю на себя и на свою мамку, а никак не на тебя и не на твою мамку (это если моя и твоя мамка не один и тот-же человек).

Xoxole
  • 601
  • 4
  • 13
  • 12
    o_O нечего добавить – katso Nov 21 '16 at 06:56
  • нормальный пример привел) – tCode Nov 21 '16 at 07:20
  • 3
    Лучшее определение для понятия. Но на собеседованиях так говорить, конечно, не надо))) – pavel163 Nov 21 '16 at 07:22
  • 4
    @pavel163 ну а что, сказал собеседующему super - это твоя мамка и сразу на работу возьмут. – Алексей Шиманский Nov 21 '16 at 07:24
  • 4
    @katso можно еще добавить "ты - это твоя мамка" (это ж Java и ООП, наследник является родителем). Ужасная и дико дырявая абстракция. –  Nov 21 '16 at 08:43
  • @PashaPash, на "ты" и "мамка" надо смотреть не с точки зрения инстанса класса (он - один), а с точки зрения таблицы виртуальных функций - они разные. – Qwertiy Nov 21 '16 at 10:10
  • 1
    @Qwertiy тем хуже - получается что то, что "он и мать" не один большой человек, а два разных - это всего лишь деталь реализации :) –  Nov 21 '16 at 11:56
  • @PashaPash, у каждого класса своя таблица виртуальных функций. Это две разные таблицы, не одна и та же. Но таблица потомка в некотором смысле является дочерней для таблицы родителя - она содержит те же функции кроме переопределённых и новых. Кстати, прототипное наследование что-то вспомнилось :) Так что в такой интерпретации ответ корректен. – Qwertiy Nov 21 '16 at 12:02
  • 3
    @Qwertiy в терминах классов - да. в терминах инстансов - нет. и потом кто-то приходит и спрашивает что-то вроде "а как на эту мамку получить ссылку" http://ru.stackoverflow.com/questions/560889/. –  Nov 21 '16 at 12:07
  • @PashaPash, ну если очень постараться, то, наверное, можно и получить? Только пошаманить с рантайм-патчингом кода немного))) – Qwertiy Nov 21 '16 at 12:12
20

super - это указание компилятору обратиться невиртуальным образом к родительскому методу на текущем объекте (this). Именно поэтому его нельзя сохранить в переменную.

Qwertiy
  • 123,725
8

В соседнем ответе от @Xoxole представителями сообщества были обнаружены недостатки. А в частности, мать и ребёнок это разные объекты, а this и super -- один. Попытаюсь их исправить.

this - это ты сейчас, т.е экземпляр человека взрослого, умеющего читать и писать. super -- это всё что тебе осталось от себя в младенчестве, умеющего кушать с бутылочки. Если ты говоришь this и super ты имеешь в виду себя и себя в детстве. Если я говорю this и super -- я указываю на себя и себя в младенчестве, а никак не на тебя сейчас или в детстве. Когда ты и я стали взрослыми людьми, мы переопределили способность кушать с бутылочки на способность кушать с тарелки вилкой. Но мы всё еще можем кушать с бутылочки (вызывать методы super сами по своему усмотрению), но уже никому этого не покажем -- если нам предложат пообедать другие , то мы согласимся только при наличии тарелки и вилки.

4per
  • 2,696