Конструктор наследование java

Наследование конструктора Java

Мне было интересно, почему в java-конструкторах не наследуются? Вы знаете, когда у вас есть такой класс:

Позже, когда вы наследуете от Super , java будет жаловаться на то, что конструктор по умолчанию не определен. Решение, очевидно, что-то вроде:

Этот код повторяется, а не DRY и бесполезен (IMHO). так что он снова задает вопрос:

Почему Java не поддерживает наследование конструктора? Есть ли какая-либо польза в том, что вы не разрешаете это наследование?

Предположим, что конструкторы были унаследованы. тогда, потому что каждый класс в конечном итоге происходит от Object, каждый класс будет иметь конструктор без параметров. Это плохая идея. Что именно вы ожидаете:

Теперь потенциально должен быть способ легко создать «сквозные» конструкторы, которые довольно распространены, но я не думаю, что это должно быть значение по умолчанию. Параметры, необходимые для создания подкласса, часто отличаются от параметров, требуемых суперклассом.

Когда вы наследуете Super, это происходит на самом деле:

Итак, это причина, потому что вам нужно вызвать ваш уникальный конструктор, так как «Super» не имеет значения по умолчанию.

Теперь, пытаясь угадать, почему Java не поддерживает наследование конструктора, возможно, потому, что конструктор имеет смысл только в том случае, если он говорит о конкретных экземплярах, и вы не сможете создать экземпляр чего-либо, когда вы не знаете как он определяется (полиморфизмом).

Поскольку построение вашего объекта подкласса может быть выполнено иначе, чем ваш суперкласс построен. Возможно, вы не захотите, чтобы клиенты подкласса могли вызывать определенные конструкторы, доступные в суперклассе.

В этом примере вы увидите, что вам нужно каким-то образом объявить, что «я хочу наследовать эти конструкторы» или «Я хочу наследовать все конструкторы, кроме этих», а затем вам также нужно указать предпочтение наследования конструктора по умолчанию на всякий случай, если кто-то добавит новый конструктор в суперкласс. или вы можете просто потребовать повторить конструкторы из суперкласса, если вы хотите «наследовать» их, что, возможно, является более очевидным способом его выполнения,

Поскольку конструкторы представляют собой детали реализации — они не являются тем, что пользователь интерфейса/суперкласса может вообще вызывать. К тому моменту, когда они получают экземпляр, он уже построен; и наоборот, в то время, когда вы создаете объект там по определению, нет переменной, которой он в настоящее время назначен.

Подумайте, что это значит заставить все подклассы иметь наследуемый конструктор. Я утверждаю, что проще передать переменные напрямую, чем для «магически» класса иметь конструктор с определенным числом аргументов только потому, что он выполняет родительский.

Конструкторы не являются полиморфными.
При работе с уже построенными классами вы можете иметь дело с объявленным типом объекта или любым его подклассом. То, что наследование полезно.
Конструктор всегда вызывается для конкретного типа, например new String() . Гипотетические подклассы в этом не играют никакой роли.

Ответ Дэвида правильный. Я хотел бы добавить, что вы можете получить знак от Бога, что ваш дизайн испорчен, и что «Сын» не должен быть подклассом «Супер», но вместо этого у Super есть некоторые особенности реализации, наиболее выраженные благодаря функциональности, которую предоставляет Сын, в качестве стратегии.

Читайте так же:  Нотариус на второй речке владивосток

РЕДАКТИРОВАТЬ: Ответ на вопрос Джона Скита является самым замечательным.

Не один убедительный ответ.

Каждая проблема, с которой вы (обладаете) с наследованием конструктора уже имеете с любым другим методом. Если у вас есть ошибка в вашем унаследованном классе, чем есть ошибка. Драма.

Эти популярные «сквозные конструкторы» действительно раздражают дерьмо. Я ненавижу, что JAVA постоянно заставляет меня писать глупый код только по религиозным соображениям.

Потому что класс (супер) должен иметь полный контроль над тем, как он построен. Если программист решает, что нет смысла предоставлять конструктор по умолчанию (без аргументов) как часть контракта класса, тогда компилятор не должен предоставлять его.

Вы, по сути, наследуете кондукторов в том смысле, что вы можете просто называть супер, если и когда это уместно, просто, что это будет ошибка, подверженная причинам, о которых другие говорили, если это произошло по умолчанию. Компилятор не может предположить, когда это уместно, а когда нет.

Задача компилятора — обеспечить как можно большую гибкость, уменьшая сложность и риск непредвиденных побочных эффектов.

Наследование и конструктор по умолчанию

Основы языка Java

Подскажите пожалуйста, немогу понять логики.
Есть класс А

Как написано в книжке:
если у класса нет конструктора то компилятор сам создает конструктор по умолчанию как у предка.

Но как сказано в той же книжке, если я создаю какой либо конструктор то конструктор по умолчанию не создается.
Так какого ж тогда для второго класса компилятор его пытается создать ?

1. Если Вы создаете класс и в нем определяете конструктор с аргументами (класс AClass, у которого только один конструктор, который принимает int i), то компилятор уже не создаст конструктор по умолчанию. Потому что это нарушило бы контракт класса AClass, который не может быть инициализирован без аргументов. Если Вы хотите еще иметь и конструктор по умолчанию, задавайте теперь его явно.

Иначе нельзя было бы запретить создание конструктора по умолчанию, что было бы плохо.

2. При создании конструкторов класса BClass, который наследуется от другого класса, компилятор требует, чтобы первой строкой конструктора был вызов другого конструктора (унаследованного или в этом классе).

Почему? Потому что раз Вы наследуетесь от какого-то класса, Вы хотите повторно использовать его логику. Конструктор приводит экземпляр класса в какое-то начальное целостное состояние. В Вашем случае для инициализации AClass требует аргумент, без которого JVM не знает, как инициализировать экземпляр класса.

Если у класса не определены конструкторы, то он пытается создать конструктор по умолчанию, т.е. без аргументов:

Поскольку здесь явно конструкторы не определены И класс не наследуется от других классов, компилятор создает конструктор по умолчанию.

Это эквивалентно такому определению:

Теперь посмотрим на BClass1:

Здесь тоже явно конструкторы не определены, и компилятор пытается создать конструктор по умолчанию. Поскольку в классе AClass1 есть конструктор по умолчанию, он создаст конструктор по умолчанию, который будет вызывать конструктор AClass1. Этот код эквивалентен такому:

В Вашем случае создается класс БЕЗ конструктора по умолчанию:

Поскольку тут описан (хотя бы один) конструктор, конструктор по умолчанию уже не создается. Т. е. такой код уже не будет компилироваться:

Читайте так же:  Требования к тендерной документации и ее состав

нужно что-то вроде

Соответственно, любой конструктор BClass будет требовать вызова какого-либо конструктора AClass или BClass. При таком описании компилятор будет ругаться:

Потому что будет попытка вызова конструкора по умолчанию класса AClass, который не определен:

Тем не менее, можно создать класс BClass с конструктором по умолчанию, задав какое-то значение для конструктора AClass:

Java / Наследование и конструктор

Автор: St1G ← к списку ← →

В java наследуемый объект по умолчанию расширяется, потому приобретает новые характеристики(поля) и, соответственно, используя родительский конструктор, мы не опишем объект полностью, этого будет мало для создания объекта.

А если ближе к предметной области — родитель имеет скрытые от наследников поля, которые тоже инициализируются часто в конструкторе, что делает родительский конструктор абсолютно непригодным для наследника.

Если Вам понравился вопрос, проголосуйте за него

Голосов: 57 Голосовать

Конструктор наследование java

Используя сайт, вы подтверждаете, что вы прочитали и поняли политику о куки, политику конфиденциальности и наше пользовательское соглашение.

Конструкторы Java

Есть базовый конструктор:

И его наследник:

Попытка создать объект:

Ошибка: конструктора с такими параметрами не существует.

Будьте добры, скажите, почему так? В других объектных языках это работает, но не в Java..

Вам старшие товарищи уже все разъяснили, но позволю пару замечаний:

  1. В абстрактных классах обычно не создаются публичные конструкторы, поскольку они бессмысленны — надеюсь понятно почему
  2. Я конечно, не grammar nazi, но отмечу, что имя класса должно быть с большой буквы — согласно общепринятым нормам изложенным в Java Code Conventions.

Ваш код должен выглядеть примерно так:

  • У языкового решения с неявным наследованием конструкторов больше проблем, чем пользы.