![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Omut |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 22.12.2005 Репутация: нет Всего: нет |
Может это поможет Поведение полиморфных методов внутри конструкторов Вот оттуда
|
||||
|
|||||
| pompei |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 1 Всего: 6 |
Объясняю популярно: конструктор - это не метод который сам создаёт объект. Конструктор - это почти обычный (не статический) метод, который отличается от обычного метода тем, что: 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 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
||||||||
|
|||||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |