Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем вводят слово super? 
:(
    Опции темы
Omut
Дата 23.3.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.12.2005

Репутация: нет
Всего: нет



Цитата

Может есть статья, в которой объясняется мой вопрос?

Может это поможет
Поведение полиморфных методов внутри конструкторов
Вот оттуда
Цитата

В качестве результата, хорошие руководящие принципы для конструктора "Делайте в конструкторе настолько меньше, насколько можете и если это возможно, то не вызывайте никаких методов". Существует только один тип методов, которые безопасно вызывать из конструктора, это final методы из базового класса. (Это так же применимо и к private методам, которые так же являются final.) Они не могут быть переопределены и поэтому не могут преподнести своего рода сюрприз

PM MAIL   Вверх
pompei
Дата 18.10.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: 1
Всего: 6



Цитата(JVM @ 20.3.2007,  13:59)
Мои рассуждения следующие. Когда я создаю объект А2
Код

new A2();
вызывается конструктор
Код

  A2(){
    super();
    testSuper();
  }

в котором вызывается конструктор родительского класса
Код

A1(){
    testSuper();
  }
т.к. объект класса А2 еще не создан, то вызывается метод не А2.testSuper(), а А1. testSuper().

Но судя по результату работы программы в этой логике есть ошибка. Мне как раз и хочется понять где она?

Объясняю популярно: конструктор - это не метод который сам создаёт объект. Конструктор - это почти обычный (не статический) метод, который отличается от обычного метода тем, что:
1) вызывается особым образом (через оператор new);
2) не наследуется (т.е. конструктор делать обязательно нужно, а если Вы не указали ни одного конструктора, то компилятор создаёт конструктор по умолчанию);
3) между оператором new и вызовом конструктора происходят какие-то действия.

Теперь давайте посмотрим что детально происходит в строчке: new A2();

1) создаётся инстанция объекта класса A2 с пустыми полями (т.е. = null);
2) вызываются инициализаторы этих полей, если они есть;
3) вызывается метод-конструктор (как видите объект уже давно существует, а конструктор его только вызвался);
4) возвращается ссылка на объект, если небыло необработанных исключений.

Важно знать, что если первой строкой не стоит оператор super( ... ) в конструкторе, то там по умолчанию ставиться оператор super(); т.е. вызывается родительский конструктор по умолчанию. Если у родителя нет конструктора по умолчанию (или он не доступен), то генерируется исключение уровня компиляции.

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

Важно знать, что если Вы определили какой-нибудь конструктор, отличный от конструктора по умолчанию, то конструктор по умолчанию НЕ создаётся.

Если Вы знаете C++, то знайте, что в яве все методы виртуальные - это значит, что когда вызывается метод, то компилятор смотрит на класс самого объекта, а не на класс переменной.
Например:
A a = new B();
a.f() - f вызывается у B.
А если у класса объекта нет такого метода, то этот метод ищется у его родителей в последовательности: отец, дедушка, прадедушка и т.д. (на самом деле там ни какого поиска нет, всё работает быстро, но пока можно думать что там все методы при их вызове ищуться описанным образом)

Теперь посмотрим что же происходить в нашем случае:
1) Создаётся инстанция объекта класса А2
2) Вызывается конструктор А2
3) вызывается конструктор А1 (потому что есть super)
4) вызывается родительский к А1 конструктор по умолчанию
5) этот конструктор отрабатывает и управление возвращается к конструктору А1
6) в конструкторе А1 вызывается у объекта this метод с именем testSuper
7) т.к. this - это ссылка на объект класса А2, то поиск метода начинается с А2 - сразу находиться и вызывается метод А2.testSuper и в качестве аргумента this передается ему наш объект.
8) дорабатывает конструктор А1
9) управление возвращается в конструктор А2
10) у объекта this вызывается метод с именем testSuper
11) т.к. this - это ссылка на объект класса А2, то поиск метода начинается с А2 - сразу находиться и вызывается метод А2.testSuper и в качестве аргумента this передается ему наш объект.
12) дорабатывает конструктор А2
13) возвращается наш объект.

А вообще чтобы не париться с этими мелочами, не вызывайте в конструкторе никаких своих методов. Исключением могут быть статические методы, методы других классов, или финальные методы, которые нельзя переопределять и подобных изъянов не будет.


Это сообщение отредактировал(а) pompei - 18.10.2007, 13:28
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.