|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
Можно ли сделать обязательным вызов конструктора базового класса?18.08.2013, 21:31. Показов 6060. Ответов 19
Метки нет (Все метки)
Собственно, вопрос в названии. Хотелось бы, чтобы в конструктор наследника выдавал ошибку, если не вызван какой-либо из конструкторов базового класса.
0
|
|
| 18.08.2013, 21:31 | |
|
Ответы с готовыми решениями:
19
Вызов конструктора базового класса Вызов конструктора абстрактного базового класса Вызов конструктора базового класса из порожденного |
|
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
|
||
| 18.08.2013, 21:37 | ||
|
1
|
||
|
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
|
||
| 18.08.2013, 21:46 | ||
|
1
|
||
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
| 18.08.2013, 21:59 [ТС] | |
|
Divizal, Care, а если я не создаю конструктор по умолчанию класса наследника, могу ли я быть уверен, что вызовуться созданные компилятором дефолтные конструкторы и, таким образом, поля, которые я указывал как: public int x = 10 или public myClass a = new myClass() приобретут указанные значения?
0
|
|
|
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
|
||
| 18.08.2013, 22:14 | ||
|
то есть такая инициализация как у вас будет произведена в конструкторе.
1
|
||
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||
| 18.08.2013, 22:37 [ТС] | ||||||
|
Care, во всех конструкторах, кроме тех, где я это явно прописываю?
Или тут будет дважды выделена память?
0
|
||||||
|
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
|
||
| 18.08.2013, 22:52 | ||
|
0
|
||
|
|
|||||||
| 18.08.2013, 23:33 | |||||||
|
запустите ка вот этот код
1
|
|||||||
|
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
|
|
| 18.08.2013, 23:39 | |
|
0
|
|
|
|
||
| 18.08.2013, 23:47 | ||
|
Не по теме: Обычно я благодарен когда мне указывают на мою ошибку, это облегчает мне жизнь в будущем.
1
|
||
|
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
|
|
| 19.08.2013, 00:05 | |
|
0
|
|
|
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
|
|||||||||||||||||
| 19.08.2013, 00:21 | |||||||||||||||||
|
nexen, если вы переживаете по поводу того, что у объекта будут не инициализированные переменные, то советую внимательно прочитать вот эту статью: http://www.quizful.net/post/ja... ialization Прочитав ее вы будете лучше разбираться в порядке инициализации, в частности:
1. Child() вызовет super() //<- даже если это слово явно не указано в конструкторе, оно все-равно присутствует в самом начале! 2. Parent() вызовет super() 3. Object() //<- так как все объекты наследуются от этого класса. Таким образом, у вас при создании любого объекта выполняется подобного вида цепочка вызовов. Единственное тут стоит учесть вот что: пусть у вас есть класс:
2
|
|||||||||||||||||
|
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
|
||
| 19.08.2013, 12:47 | ||
|
1
|
||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 3
|
|||||||
| 19.08.2013, 20:20 | |||||||
0
|
|||||||
|
|
|||||||
| 19.08.2013, 20:34 | |||||||
Сообщение было отмечено как решение
Решениевы создаёте обьект класса А, значит и проперти х будет его, но перед созданием вы вызываете конструктор парент класса а у того есть метод в конструкторе выводящий проперти х, но так как конструктор парента ещё не завершился, то наше локальное х пока ещё инициализированно по дефолту нулём как примитив. вот когда парент завершился, вот тогда будет инициализировано проперти х и станет 2 слегка модифицируем класс А и всё становится понятно
в JVM есть приоритет запуска методов, так вот вызов парент конструктора это invokespecial (максимальный приоритет), для того чтобы произвести инициализацию иерархии наследования, а уже потом повалят invokestatic и invokevirtual, ваш вопрос не опровергает Skipy, так как вы использовали чит наследования, в общих случаях инициализация поля именно ДО конструктора )
3
|
|||||||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 3
|
|
| 20.08.2013, 11:33 | |
|
Я не сомневался что Skipy ответит правильно, но всеже инициализация работает не ДО вызова конструктора а после вызова родительского конструктора (если считать что вызов родительского конструктора идет внутри конструктора потомка, как например в вашем примере конструктора класса А).
0
|
|
|
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
|
|||
| 20.08.2013, 12:33 | |||
1
|
|||
|
|
|||||||
| 20.08.2013, 12:39 | |||||||
|
итак как же происходит инициализация: 1. конструктор неявно или явно вызывает super() (в том числе и с параметрами) - этот вызов выполняется как invokespecial так как он нужен для того чтобы пройти по иерархии наследования и выполнить линковку текущего класса с методами парентов и абстрактов находящихся над ним. 2. эта линковка продолжается до класса Object и при спуске вниз выполняется оверрид методов и перелинковка 3. для того чтобы начать спуск вниз должно быть выполнено одно условие - должен завершиться парент конструктор. 4. в случае если в иерархии внутри конструктора производится вызов какого либо метода он будет выполнен 5. проперти с одинаковыми именами затеняют паренты если не указывать модификатор super.propertyName 6. любой метод из парента пытающийся получить значение затенённого проперти - получит значение заттеняющего из самого нижнего. 7. до момента завершения конструктора парента собственные проперти инициализированы дефолтным значением в случае примитивов и null в случае объектов. 8. после завершения конструирования иерархии и линковки класс инициализирует собственные проперти 9. выполняются инструкции в конструкторе и конструктор завершается 10. класс находится в консистент стейте и готов к работе Для более глубокого понимания приколов связанных с приоритетами рекомендую почитать про утечки this в конструкторе, типа такого:
1
|
|||||||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 3
|
||
| 20.08.2013, 12:54 | ||
|
0
|
||
| 20.08.2013, 13:01 | |
|
Помогаю со студенческими работами здесь
20
Вызов конструктора базового класса из класса-наследника
Знакомство с наследованием. Вызов конструктора базового класса Вызов базового конструктора Вызвать конструктор производного класса без конструктора базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|