|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
Можно ли сделать обязательным вызов конструктора базового класса?18.08.2013, 21:31. Показов 6009. Ответов 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
Вызов конструктора базового класса из класса-наследника
Знакомство с наследованием. Вызов конструктора базового класса Вызов базового конструктора Вызвать конструктор производного класса без конструктора базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|