Как стать автором
Обновить

Комментарии 17

Ну B.f() called, видимо.

P.S. После шарпа как-то неестественно смотреть на static класс с нестатическими членами.
static в данном случае я поставил, для того чтобы можно было создать инстанс B без создания инстанса A (а оно потребовалось бы, потому что B объявлен внутри A)
B объявлен внутри A для того чтобы скомпилировать все в одном файле (был и другой способ — расопложить просто рядом, но тогда были бы вопросы почему B не public класс)
Вобщем тут ни чего хитрого, просто такого оформление получилось, я не заморачивался сильно.
Суть задачи в том что это такая за ссылка this в конструкторе базового класса, и что с ней происходит, если наследник отказывается от создания себя (и вообще отказ ли это)
Ну как то так :)
Как только было написано «new» — объект уже точно создан. Дальше будет идти только инициализация его.
Базовый конструктор должен выполнится до конструктора-наследника, значит точно не первый вариант.
Мне почему-то кажется, что «A.f() called». К сожалению я не пишу на Джаве, так что могу только догадываться.
я, конечно, могу ошибаться ( все мы можем ошибаться :) ), но IMHO — super() не нужен. Он как-бы автоматом вызваться должен… И вывестись, вроде как B.f() called должен…
Правда интересная задачка! Спасибо!

Вроде по логике должен быть null, т.к. объект так и не создался…

А с другой — при обращении к конструктору место в памяти уже выделилось, и ссылка на это место сохранилась в staticInstance…

Думаю все же будет «B.f() called»
Будет выведено «B.f() called».
Насмотря на то, что из конструктора класса B было брошено исключение — конструктора класса A отработал и staticInstance был инициализирован.
Статические члены класса не завязаны на его инстансы.
Поскольку мы создавали объект класса B, то staticInstance указывает именно на него и будет вызван метод, который мы переопределили в B (в java все методы виртуальны). Другая картина бы была, если бы мы объвили метод f, как static (в этом случае мы увидили бы «A.f() called»).
мда. джава позволяет при желании отстрелить себе ногу.

собсно интересно, почему вообще должен создаваться объект у которого конструктор кинул Exception? как насчет того, что мы не знаем, в каком состоянии создаваемый объект. ИМХО самым корректным решением было бы «staticInstance is null», ибо время жизни объекта должно начинаться после завершения работы конструктора.

з.ы. первая мысль которая приходит в голову при таком коде — segfault
Причем здесь segfault?
JVM создала объект B: выделила память, заполнила поля дефолтными или заданнымим значениями (если бы они были). Затем JVM начала вызывать конструктор, который уже ничего не создает, а служит только для инициализации объекта более сложным путем, нежели присваивание полям значений, вычислимых на этапе компиляции.
А то, что конструктор бросил исключение, но на объект осталась ссылка — с этим ничего не поделать — это ошибка программиста.
если за использование такого кода не убивать, тогда за что?
Бить линейкой по пальцам :)
важен не код, а то что в голове
для зарабатывания денег, какой только код не приходилось писать
как правило чем лучше код, тем больше времени на него уходит
в общем все зависит от целей
конкретно про данный пример — у меня не было цели и времени красиво оформлять, просто поделился небольшим своим открытием, вдруг кому полезно будет знать
НЛО прилетело и опубликовало эту надпись здесь
Расскажите, с чего вдруг B стал синглтоном?
НЛО прилетело и опубликовало эту надпись здесь
Да хорошо, хорошо. Singleton почему?
Где ограничение на количество экземпляров?
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории