![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Andy_L20066 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 10.3.2008 Репутация: нет Всего: 1 |
привет,
тут в тесте одном нашел, попробывал компилить, короче вопрос следующий:
говорит что - то про intermediate constructor: no enclosing type of instance A is available due to some intermediate constructor invokation Это значит что обект класса С невозможно создать? Тоесть обьект класа B cоздать можно:
а клас С - нет? |
||||
|
|||||
| alon4ik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.9.2009 Где: Харьков Репутация: нет Всего: нет |
а так?
|
|||
|
||||
| Andy_L20066 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 10.3.2008 Репутация: нет Всего: 1 |
ну, static там пройдет.... я просто хочу удостоверится что я думаю правильно...
|
|||
|
||||
| Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
Andy_L20066
Интересная тема. Попробую разобраться. Главная идея: экземпляр внутреннего класса не может существовать без экземпляра внешнего. Для этого компилятор втихаря создает конструктор для внутреннего класса, который принимает параметром экземпляр внешнего -- вуаля, пока внешний не инстанциировал, внутренний не создаш. Вызывается этот спрятанный конструктор с помощь специальной формы для инстанциирования внутреннего класса, встроенной в язык: (new A()).new B(). Соответственно твой код должен гаранировать, что при создании внутреннего класса внешний будет инстанциирован. Вот такое будет собираться:
Получается что твой пример не собирается потому что компилято видит, что мы каким то образом сможем создать C без A... Но ведь пробемы с классом B у него не возникло.. гм гм.. что то с переопределнием конструкторов? .. может кто подскажет дальнейший ход мысли? Это сообщение отредактировал(а) Maksym - 16.9.2009, 19:12 |
|||
|
||||
| goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
такой вариант тоже скомпилится
но хоть убей не пойму почему не может скомпилиться исходный вариант Это сообщение отредактировал(а) goodday1941 - 17.9.2009, 12:42 -------------------- SCJP 6 |
|||
|
||||
| goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
баг ждк? )
-------------------- SCJP 6 |
|||
|
||||
| Maksym |
|
||||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
Он его создает. У меня твой вариант тоже не собрался, проверь еще раз. Тоже самое:
Но только ошибку показывает уже на вызове super() в C. Но это подтолкнуло к пониманию ситуации в примере Andy_L20066 Компилятор пытается создать дефолтный констуктор для C и как положено неявно вызывает super(). То есть дефолтный конструктор B. То есть пытается вызвать конструктор внутреннего класса не имея инстанса внешнего класса. А этого делать нельзя. Поэтому вся конструкция ошибочна. |
||||
|
|||||
| goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
да действительно не компилится мой вариант (понадеялся на идею, но она оказівается тоже ошибается)
да місль уловил.. вполне разумно ) -------------------- SCJP 6 |
|||
|
||||
| Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
goodday1941
Вот нашел у Эккеля (см. секцию "Inheriting from inner classes"). Он объясняет ситуацию немного по другому (наверняка правильнее
Что ж, логично. Это сообщение отредактировал(а) Maksym - 18.9.2009, 12:58 |
|||
|
||||
| goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
эм.... хочу уточнить правильно ли я все понял:
получается на данный момент у потомка иннер класса нету референза на энклосинг класс правильно? я к тому что к примеру в ждк 7 эту ссылку добавят и сей код будет компилится -------------------- SCJP 6 |
|||
|
||||
| Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
goodday1941
Нет, ты знаешь, я тут все заново передумал и все равно до конца не врубаюсь. Тут какая-то путаница получилась. Для обычного внутреннего класса компилятор добавляет ему final поле типа внешнего класса и конструктор который экземпляр этого класса принимает и в это поле кладет. Для его наследника он тоже это может сделать. Вот такой пример собирается.
Фишка в B extends A. Это наследование не дает примеру откомпилироваться. |
|||
|
||||
| Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
Нашел детальное разъяснение конкретно для нашего примера.
Мое объяснение
таки было правильным в целом. А потом я сам себя запутал |
|||
|
||||
![]()
|
| Правила форума "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. |