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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструктор innerClass, наследование  
V
    Опции темы
Andy_L20066
Дата 16.9.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



привет, 
тут в тесте одном нашел, попробывал компилить, короче вопрос следующий:  

Код

public class A{
class B extends A{}
class C extends B{} //здесь матюкается
public static void main(String[] args) {
 }
}


говорит что - то про intermediate constructor: no enclosing type of instance A is available due to some intermediate constructor invokation

Это значит что обект класса С невозможно создать? Тоесть обьект класа B cоздать можно:
Код

A.B b = new A().new B();


а клас С - нет? 
PM MAIL ICQ   Вверх
alon4ik
Дата 16.9.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а так?

Код

public class A{
static class B extends A{}
static class C extends B{} //здесь матюкается
public static void main(String[] args) {
 }
}

PM MAIL   Вверх
Andy_L20066
Дата 16.9.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну, static там пройдет.... я просто хочу удостоверится что я думаю правильно...
PM MAIL ICQ   Вверх
Maksym
Дата 16.9.2009, 19:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



Andy_L20066
Интересная тема.
Попробую разобраться.
Главная идея: экземпляр внутреннего класса не может существовать без экземпляра внешнего. Для этого компилятор втихаря создает конструктор для внутреннего класса, который принимает параметром экземпляр внешнего -- вуаля, пока внешний не инстанциировал, внутренний не создаш. Вызывается этот спрятанный конструктор с помощь специальной формы для инстанциирования внутреннего класса, встроенной в язык: (new A()).new B().

Соответственно твой код должен гаранировать, что при создании внутреннего класса внешний будет инстанциирован.
Вот такое будет собираться:
Код

public class A {
    class B extends A {
    }

    class C extends B {
        C(A a) {
            a.super();
        }
    }

    public static void main(String[] args) {
    }
}


Получается что твой пример не собирается потому что компилято видит, что мы каким то образом сможем создать C без A... Но ведь пробемы с классом B у него не возникло.. гм гм.. что то с переопределнием конструкторов? .. может кто подскажет дальнейший ход мысли?


Это сообщение отредактировал(а) Maksym - 16.9.2009, 19:12
PM MAIL   Вверх
goodday1941
Дата 17.9.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

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



такой вариант тоже скомпилится

Код

class A {
    class B extends A {
        B() {
            super();
        }
    }
    class C extends B {
        C() {
            super();
        }
    }
}


но хоть убей не пойму почему не может скомпилиться исходный вариант  smile , ведь компилятор вроде как сам должен вставлять дефолтовые конструкторы с вызовом super() вначале

Это сообщение отредактировал(а) goodday1941 - 17.9.2009, 12:42


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
goodday1941
Дата 17.9.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

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



баг ждк? )


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Maksym
Дата 17.9.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



Цитата(goodday1941 @  17.9.2009,  11:39 Найти цитируемый пост)
ведь компилятор вроде как сам должен вставлять дефолтовые конструкторы с вызовом super() вначале

Он его создает. У меня твой вариант тоже не собрался, проверь еще раз.
Тоже самое:
Код

No enclosing instance of type A is available due to some intermediate constructor invocation

Но только ошибку показывает уже на вызове super() в C.

Но это подтолкнуло к пониманию ситуации в примере Andy_L20066   smile 
Компилятор пытается создать дефолтный констуктор для C и как положено неявно вызывает super(). То есть дефолтный конструктор B. То есть пытается вызвать конструктор внутреннего класса не имея инстанса внешнего класса. А этого делать нельзя. Поэтому вся конструкция ошибочна.

PM MAIL   Вверх
goodday1941
Дата 18.9.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

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



да действительно не компилится мой вариант (понадеялся на идею, но она оказівается тоже ошибается)



Цитата(Maksym @  17.9.2009,  17:27 Найти цитируемый пост)
Компилятор пытается создать дефолтный констуктор для C и как положено неявно вызывает super(). То есть дефолтный конструктор B. То есть пытается вызвать конструктор внутреннего класса не имея инстанса внешнего класса. А этого делать нельзя. Поэтому вся конструкция ошибочна.

да місль уловил.. вполне разумно )


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Maksym
Дата 18.9.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



goodday1941
Вот нашел у Эккеля (см. секцию "Inheriting from inner classes"). Он объясняет ситуацию немного по другому (наверняка правильнее smile ):
Цитата

The problem is that the “secret” reference to the enclosing class object must be initialized, and yet in the derived class there’s no longer a default object to attach to. The answer is to use a syntax provided to make the association explicit.

Что ж, логично.  smile 

Это сообщение отредактировал(а) Maksym - 18.9.2009, 12:58
PM MAIL   Вверх
goodday1941
Дата 18.9.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

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



эм.... хочу уточнить правильно ли я все понял:

получается на данный момент у потомка иннер класса нету референза на энклосинг класс правильно?

я к тому что к примеру в ждк 7 эту ссылку добавят и сей код будет компилится


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Maksym
Дата 18.9.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



goodday1941
Нет, ты знаешь, я тут все заново передумал и все равно до конца не врубаюсь. Тут какая-то путаница получилась.
Для обычного внутреннего класса компилятор добавляет ему final поле типа внешнего класса и конструктор который экземпляр этого класса принимает и в это поле кладет.
Для его наследника он тоже это может сделать. Вот такой пример собирается.
Код

public class A {

    class B {
    }

    class C extends B {
    } 

}


Фишка в B extends A. Это наследование не дает примеру откомпилироваться.
PM MAIL   Вверх
Maksym
Дата 19.9.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



Нашел детальное разъяснение конкретно для нашего примера.
Мое объяснение
Цитата

Компилятор пытается создать дефолтный констуктор для C и как положено неявно вызывает super(). То есть дефолтный конструктор B. То есть пытается вызвать конструктор внутреннего класса не имея инстанса внешнего класса. А этого делать нельзя. Поэтому вся конструкция ошибочна.

таки было правильным в целом.

А потом я сам себя запутал  smile 
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.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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