![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| bogomol |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 7.3.2007 Репутация: нет Всего: нет |
И для чего оно нужно? И к чему прикладывается?
|
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
для обращения к полю/методу суперкласса (класса родителя).
|
|||
|
||||
| JUncle |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 6.4.2006 Где: Казань, РФ Репутация: нет Всего: 1 |
И к конструкторам.
Это сообщение отредактировал(а) JUncle - 18.3.2007, 15:00 --------------------
class JUncle extends Man // singleton{/*...*/} |
|||
|
||||
| JVM |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
Мне кажется это очевидно, но не дает полного ответа на вопрос bogomol. Ну обратились мы к методы супер класса, ну и что? Зачем это надо? Не рискну отвечать на этот вопрос - не тот уровень знаний - но думаю ответ лежит в основах ООП: наследование, полиморфизм, переопределение и т.д. и понимание, и уж тем более правильное применение придет не сразу. Уж коль начали обсуждать эту тему задам и свой вопрос, на который ответ пока не нашел(может плохо искал ...) Есть два класса - один супер класс, другой дочерний:
Не могу понять почему, при вызове конструктора супер класса А1 вызывается метод дочернего класса А2? Подскажите или где можно найти ответ? |
||||
|
|||||
| y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 5 Всего: 13 |
все же очевидно. Во-первых, ты забыл перечислить еще один из главных принципов ООП - это инкапсуляция, собственно, этот термин и отвечает на твой вопрос. Мы часть логики скрываем (инкапсулируем, прячем в капсулу) в одних классах, чтобы потом эту логику ненароком не поломать в наследниках или еще где (ну и чтобы часть логики была доступна в определенных местах кода), для этого есть, в частности, приватные методы. А еще есть такая штука, как протектед методы, которые доступны в наследниках, которые мы можем перекрывать (ну и пэкедж локал методы тоже). Если нам надо при перекрытии метода сохранить логику метода предка, то надо обязательно дернуть внутри него super.thisOwerwrittenMethod(), иначе произойдет то, что произошло в этом "непонятном" примере выше - метод будет переопределен в потомке "полностью". А в примере выше, мы вызываем конструктор предка, в данном случае, чтобы отработал функционал по его созданию, но, реально, мы создаем инстанс объекта A2, где метод у нас уже переопределен, поэтому все правильно.
-------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
| JVM |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
Т.е. к тому, что переопределено из дочерних классов нельзя обратиться?
|
|||
|
||||
| y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 5 Всего: 13 |
почему это нельзя, как раз, таки, можно - используя super -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
| JVM |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
y3u, еще раз посмотрел свой пример и твой ответ. Мне все же не понятно, почему вызывается метод дочернего класса из конструктора. Ведь когда создается объект А2
вызывается конструктор класса А2, который сначала должен вызвать конструктор супер класса, т.е. объект класса А2 еще не создан, а его метод уже вызывается. Почему? Что не понимаю? Результат рабты программы
|
||||
|
|||||
| y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 5 Всего: 13 |
а почему ты решил, что он еще не создан?
Это сообщение отредактировал(а) y3u - 19.3.2007, 17:02 -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
| JVM |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
||||
|
||||
| y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 5 Всего: 13 |
Это сообщение отредактировал(а) y3u - 19.3.2007, 18:44 -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
| JVM |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
y3u, я тебя не понял. Что ты этим примером хочешь сказать? Ведь из супер класса не вызывается никакой дочерний объект ...
Что такое 'сетили'? Может есть статья, в которой объясняется мой вопрос? |
|||
|
||||
| y3u |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 5 Всего: 13 |
во-первых, из супер класса, как ты его назвал, никакие дочерние объекты не вызываются... наследование - это отношение is as, т.е. это тот же самый объект, но несколько иной, никогда не проектируют код, чтобы предок вызывал наследников, для работы с объектом нужного типа из множества однотипных существует класс паттернов проектирования Factory. Во-вторых, я отвечаю на конкретный вопрос. Задай подробно вопрос, постараюсь ответить конкретно, я отвечал на
от слова Set/Setup - есть такое понятие, как дерево объектов, все объекты в Java наследуются от Object, когда отрабатывает конструктор, то объект конструируется снизу вверх, сначала создаются объеты по иерархии, начиная с Object, таким образом, к моменту создания твоего A2, объект A1 уже создан, но не до конца, так сказать... это я к слову о
А вызывается метод класса A2, потому что ты пишешь ты создаешь инстанс объекта A2, где метод УЖЕ переопределен, поэтому он и дергается из конструктора A1 уже переопределенный Это сообщение отредактировал(а) y3u - 20.3.2007, 12:20 -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
||||||
|
|||||||
| JVM |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
Вот это объяснение мне и не понятно. Как может быть переопределен метод в объекте который еще не создан(объект)? Мои рассуждения следующие. Когда я создаю объект А2
в котором вызывается конструктор родительского класса
Но судя по результату работы программы в этой логике есть ошибка. Мне как раз и хочется понять где она? |
||||||
|
|||||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 6 Всего: 360 |
Методы как таковые в обьектах не существуют. Есть только указатели на них. Эти указатели расставлены естественно ещё до вызова конструктора в зависимости от имени класса. Поэтому все они указывают на методы от A2. Добавлено @ 14:05 если хочешь метод родителя, то ссылайся super.testSuper(); |
|||
|
||||
![]()
|
| Правила форума "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. |