Parus16.ru

Парус №16
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Можно ли наследовать конструктор Java

Можно ли наследовать конструктор Java?

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

Можно ли наследовать конструктор?

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

Как наследовать класс Java?

? Чтобы объявить один класс наследником от другого, надо использовать после имени класса-наследника ключевое слово extends, после которого идет имя базового класса. Для класса Employee базовым является Person, и поэтому класс Employee наследует все те же поля и методы, которые есть в классе Person.

Что такое конструктор класса Java?

Конструктор — это специальный метод, который вызывается при создании нового объекта. Не всегда удобно инициализировать все переменные класса при создании его экземпляра. … Если явного конструктора нет, то Java автоматически создаст его для использования по умолчанию.

Как вызывается конструктор?

  1. Конструктор — это особый тип метода класса, который автоматически вызывается при создании объекта этого же класса. …
  2. Правило: Используйте прямую инициализацию или uniform-инициализацию с объектами ваших классов.
  3. Правило: Не используйте копирующую инициализацию с объектами ваших классов.

Что такое подкласс Java?

Наследование является неотъемлемой частью Java. … Главный наследуемый класс в Java называют суперклассом. Наследующий класс называют подклассом. Получается, что подкласс — это специализированная версия суперкласса, которая наследует все члены суперкласса и добавляет свои собственные уникальные элементы.

Что такое наследование?

Насле́дование — переход имущества, прав и связанных с ними обязанностей умершего лица (наследодателя) к иным лицам (наследникам). Комплекс имущества, прав и обязанностей, получаемых при наследовании, называют наследственным имуществом, наследственной массой, наследством.

Как работает наследование в Java?

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

Что такое наследование классов?

Наследование классов — очень мощная возможность в объектно ориентированном программировании. Оно позволяет создавать производные классы (классы наследники), взяв за основу все методы и элементы базового класса (класса родителя).

Что такое extends в Java?

extends это ключевое слово, предназначенное для расширения реализации какого-то существующего класса. Создается новый класс на основе существующего, и этот новый класс расширяет (extends) возможности старого. implements это ключевое слово, предназначенное для реализации интерфейса (interface).

Что такое конструктор по умолчанию Java?

Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.

Что такое конструктор в классе?

В объектно-ориентированном программировании конструктор класса (от англ. constructor) — специальный блок инструкций, вызываемый при создании объекта.

Читайте так же:
Можно ли вернуть удаленный инстаграм

Зачем нужен пустой конструктор Java?

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

Когда вызывается конструктор у объекта?

Конструктор вызывается в самом начале программы до вызова функции main, деструктор — по окончании программы; … Конструктор вызывается при создании объекта, а деструктор — когда объект явно уничтожается с использованием оператора delete. Если этого не происходит, деструктор не будет вызван никогда.

Как правильно говорить конструктора или конструкторы?

При этом вариант инженерА приводит только словарь Кузнецова с пометой «разговорное» (но не допустимое). Что касается слова конструктор, то словари указывают единственно верную форму множественно числа: констрУкторы, констрУкторов.

Что такое конструкторы и деструкторы?

Конструктор и деструктор классов в C++ Начнем с того, что когда мы создаем элементы (переменные) класса, мы не можем присвоить им значения в самом определении класса. … В отличии от конструктора, деструктор (от слова destruct — разрушать) — специальный метод класса, который служит для уничтожения элементов класса.

Работа со статическим конструктором в Java

Я не получил полного понимания статических конструкторов в Java. Если это разрешено, почему это разрешено? В каких сценариях вы бы это использовали? Какой цели это будет служить? Может кто-нибудь дать мне простой пример, пожалуйста?

Строго говоря, в Java нет статических конструкторов, поскольку конструктор по определению не может быть статическим. То, на что вы ссылаетесь, называется «статическим блоком инициализации». Конструктор подразумевает, что вы создаете объект. Вы не можете иметь конструктор для класса, потому что класс не является его экземпляром. Это просто класс. То, что «конструирует» класс, называется компилятором (или виртуальной машиной, в зависимости от того, что подразумевается под «конструкциями»), и если вы попадаете в конструирование кода внутри другого кода, вы попадаете в процесс генерации кода, который совершенно другой зверь.

За исключением всех придирок, статический блок инициализации используется для инициализации сложных статических (или уровня класса) полей для класса. Обычно они используются для инициализации вещей, которые либо не могут быть инициализированы в одной строке, либо требуют, чтобы сначала был инициализирован какой-либо другой объект (который может быть или не быть в классе, в котором реализован статический блок).

По сути, их можно использовать, чтобы сказать классу: «Эй, установите переменную A на это значение FIRST, а затем, как только это будет сделано, используйте значение A для инициализации B.» Поскольку Java требует, чтобы стандартная инициализация поля выполнялась либо внутри конструктора или метода, либо с помощью вызова конструктора или метода (если это не литерал), они могут быть удобным методом для инициализации сложных статических объектов.

Читайте так же:
Можно ли устанавливать игры на диск d

Блоки статической инициализации не нужны слишком часто, и, как правило, их следует избегать, если они не имеют реального использования. Не поймите меня неправильно, они занимают свое место в Java, но, как и многие другие вещи (такие как операторы break, return, switch и goto), их можно легко использовать чрезмерно, что снижает их читаемость и удобство сопровождения кода. -на базе они используются в.

Краткий пример используемого статического блока инициализации может быть следующим (согласно превосходному объяснению статических блоков инициализации, найденных здесь ):

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

  • Если вы загружаете драйверы и другие элементы в пространство имен. Например, класс Class имеет статический блок, в котором он регистрирует нативные.
  • Если вам нужно выполнить вычисления для инициализации статических переменных, вы можете объявить статический блок, который выполняется ровно один раз, когда класс загружается впервые.
  • Проблемы, связанные с безопасностью или ведение журнала задач

Некоторые причины НЕ использовать статические блоки (в других ситуациях):

  • В JVM есть ограничение: блок статического инициализатора не должен превышать 64 КБ.
  • Вы не можете бросить Проверенные исключения.
  • Вы не можете использовать this ключевое слово, так как нет экземпляра.
  • Вы не должны пытаться получить доступ к супер, так как для статических блоков такого нет.
  • Вы не должны ничего возвращать из этого блока.
  • Статические блоки делают тестирование кошмаром.

Я должен отметить: в то время как некоторые языки (такие как C #) могут иметь синтаксис для «конструкторов», которые являются статическими, эти «конструкторы» функционируют почти так же, как статические блоки инициализации в Java, и рассматриваются многими (включая меня) как неправильные в языке, учитывая основную концепцию конструктора ООП .

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

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

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

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

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

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

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

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

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

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

Читайте так же:
Емейл вход на мою страницу

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

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

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

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

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

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

РЕДАКТИРОВАНО: ответ Джона Скита является самым удивительным.

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

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

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

Я не знаю ни одного языка, где подclassы наследуют конструкторы (но тогда я не очень много программируемый полиглотт).

Вот обсуждение того же вопроса о C #. Общий консенсус, по-видимому, заключается в том, что это усложнит язык, представит потенциал для неприятных побочных эффектов для изменений в базовом classе и, как правило, не обязательно будет в хорошем дизайне.

Читайте так же:
Можно ли сделать черный фон в вк

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

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

У меня вопрос о конструкторах по умолчанию и наследовании в Java.

Как правило, если вы пишете класс и не включаете конструктор, Java автоматически предоставляет вам конструктор по умолчанию (один без параметров), который инициализирует все переменные экземпляра класса (если они есть) с некоторыми значениями по умолчанию (0, null , или ложь). Однако если вы пишете конструктор с некоторыми параметрами и не пишете конструктор по умолчанию, тогда Java не предоставляет конструктор по умолчанию. Мой вопрос: как обстоят дела с классами, которые наследуются от других классов — если я напишу конструктор с некоторыми параметрами в них, но не включу конструктор по умолчанию, наследуют ли они конструктор по умолчанию суперкласса?

задан 08 фев ’09, 12:02

Нужно ли редактировать сообщение в строке, которая предполагает, что «Конструктор инициализирует все переменные экземпляра класса (если они есть) с некоторыми значениями по умолчанию (0, null или false)». вводить читателя в заблуждение? — Srujan Kumar Gulla

11 ответы

Если какой-либо конструктор явно не вызывает конструктор super или this в качестве своего первого оператора, автоматически добавляется вызов super ().

ответ дан 26 мар ’13, в 16:03

@Stoffe: Я предложил отредактировать ссылки, благодаря вашим комментариям. Вы можете заработать репутацию, предлагая правки, так почему бы не сделать это в будущем? — Flimm

Я бы добавил, что в случае 2 вызов super не имеет параметров. — LuxDie

Конструкторы не наследуются.

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

Да, я только что понял это, потыл ниже указал на это. Но как (и когда) тогда инициализируются поля? (см. мой комментарий к ответу Потыла). — user42155

Может быть, когда я создаю объект, Java автоматически предоставляет значения по умолчанию? Но опять же, мы создаем объекты с помощью конструкторов, верно? — user42155

Да, исследование инициализации заняло некоторое время. — звездно-голубой

Спасибо, я тоже нашел хорошую статью именно об этом — инициализации на Java, здесь: javaworld.com/javaworld/jw-03-1998/… — user42155

Обратите внимание, что конструктор по умолчанию для Object Не пустой, его родной. Конструктор обычно отвечает за такие вещи, как выделение памяти. — chrylis — осторожно оптимистично —

Читайте так же:
Можно ли вернуть деньги в стиме

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

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

Под «пустым конструктором» вы имеете в виду конструктор по умолчанию, верно? — user42155

А что, если у родителя нет конструктора по умолчанию? — user42155

Здесь я имею в виду конструктор без аргументов. Обычно конструктор по умолчанию — это тот, который вообще не определен. Вы можете определить конструктор без аргументов. — Питер Лоури

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

Вы имеете в виду «допустимый конструктор в» SUB (производном) классе? — user42155

Основное правило — вызов (или вызов) конструктора должен быть первым оператором, который JVM должен выполнить,

Поэтому, когда у вас есть суперкласс только с параметризованным конструктором и без конструктора по умолчанию, а базовый класс не имеет явного вызова параметризованного конструктора суперкласса, JVM предоставляет super (); вызов, который вызывает ошибку, поскольку для суперкласса нет конструктора по умолчанию, поэтому мы либо предоставляем конструктор по умолчанию в суперклассе, либо явно вызываем параметризованный конструктор суперкласса в конструкторе базового класса. когда мы даем явный вызов, JVM не удосуживается помещать строку super (); as вызов конструктора должен быть первым оператором метода, чего не может произойти (из-за нашего явного вызова).

Я думаю, это должно быть хорошей практикой всегда помещать туда конструктор по умолчанию, если вы хотите «перегружать» конструкторы. — lwpro2

В разделе 8.8.9 Спецификации языка Java подробно объясняется, что происходит:

  • Конструктор по умолчанию имеет ту же доступность, что и класс (§6.6).
  • Конструктор по умолчанию не имеет формальных параметров, за исключением не закрытого внутреннего класса-члена, где конструктор по умолчанию неявно объявляет один формальный параметр, представляющий непосредственно включающий экземпляр класса (§8.8.1, §15.9.2, §15.9.3 ).
  • Конструктор по умолчанию не имеет предложений throw.
  • Если объявляемый класс является первичным классом Object, то конструктор по умолчанию имеет пустое тело. В противном случае конструктор по умолчанию просто вызывает конструктор суперкласса без аргументов.

Вы можете видеть, что здесь не происходит наследования: все, что нужно для этого, — это «магия компилятора» с неявно объявленным конструктором по умолчанию. Спецификация также дает понять, что конструктор по умолчанию добавляется только тогда, когда класс вообще не имеет конструкторов, а это означает, что ответ на ваш вопрос — «нет»: как только вы дадите классу конструктор, доступ к конструктору по умолчанию его суперкласс утерян.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector