Вызов конструктора из конструктора
есть два конструктора, один конструктор (без аргументов) должен вызывать второй конструктор (с аргументом типа int ).
![]()
![]()
![]()
Если нужно вызвать конструктор родительского класса, то
если другой конструктор текущего класса, то
Всё ещё ищете ответ? Посмотрите другие вопросы с метками java или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как вызвать один конструктор из другого в Java?
можно ли вызвать конструктор из другого (внутри того же класса, а не из подкласса)? Если да, то как? И что может быть лучшим способом вызвать другой конструктор (если есть несколько способов сделать это)?
18 ответов
для привязки к определенному конструктору суперкласса вместо одного в том же классе используйте super вместо this . Обратите внимание, что вы можете подключаться только к одному конструктору и это должен быть первый оператор в вашем теле конструктора.
см. также этот вопрос, что касается C#, но где применяются те же принципы.
используя this(args) . Предпочтительным шаблоном является работа от самого маленького конструктора до самого большого.
вы также можете использовать более недавно пропагандируемый подход valueOf или просто «of»:
чтобы вызвать супер класс, используйте super(someValue) . Вызов super должен быть первым вызовом в конструкторе, или вы получите ошибку компилятора.
[Примечание: я просто хочу добавить один аспект, который я не видел в других ответах: как преодолеть ограничения требования, что это() должно быть на первой строке).]
в Java другой конструктор того же класса может быть вызван из конструктора через this() . Обратите внимание, однако, что this должно быть на первой строке.
Это this должен появиться на первой линии выглядит как большое ограничение, но вы можете построить аргументы других конструкторов с помощью статических методов. Например:
когда мне нужно вызвать другой конструктор из кода (не из первой строки), я обычно использую вспомогательный метод, например:
но чаще всего я пытаюсь сделать это наоборот, вызывая более сложные конструкторы из более простых в первой строке, насколько это возможно. Для приведенного выше примера
в конструкторе вы можете использовать this ключевое слово для вызова другого конструктора в том же классе. Это называется явный вызов конструктора.
вот еще один класс Rectangle с другой реализацией, отличной от реализации в разделе Objects.
этот класс содержит набор конструкторов. Каждый конструктор инициализирует некоторые или все переменные-члены прямоугольника.
как все уже сказали, вы используете this(…) , которая называется явный вызов конструктора.
Однако имейте в виду, что внутри такого явного оператора вызова конструктора вы не можете ссылаться на
- любой переменные или
- любой методы экземпляра или
- любой внутренние классы объявлено в этом классе или любом суперкласс, или
- this или
- super .
как указано в JLS (§8.8.7.1).
Я скажу вам простой способ
здесь два типы конструкторов:
- конструктор по умолчанию
- конструктора
я объясню в одном примере
в приведенном выше примере я показал 3 типа вызова
- этот вызов () должен быть первым оператором в конструкторе
- это название меньше возражений. это автоматически вызывает конструктор по умолчанию. 3.Это вызывает параметризованный конструктор.
Примечание.: это должен быть первый оператор в конструкторе.
да, любое количество конструкторов может присутствовать в классе, и они могут быть вызваны другим конструктором с помощью this() [пожалуйста, не путайте this() вызов конструктора с this ключевое слово]. this() или this(args) должна быть первая строка в конструкторе.
это известно как перегрузка конструктора.
Обратите внимание, что для конструктора применима только концепция перегрузки, а не наследование или переопределение.
Да можно вызвать один конструктор из другого. Но есть одно правило. Если вызов выполняется из одного конструктора в другой, то
этот новый вызов конструктора должен быть первым оператором в текущем конструкторе
Так, что-то вроде ниже не получится.
кроме того, в случае наследования при создании объекта подкласса сначала создается конструктор суперкласса называемый.
таким образом, в этом случае также другой вызов конструктора сначала объявляется перед любыми другими операторами.
вы можете конструктор из другого конструктора того же класса, используя ключевое слово «this». Пример —
выход — строка как конструктор arg.. Конструктор по умолчанию.. int как конструктор arg..
вызов конструктора из другого конструктора
Также вы можете вызвать родительский конструктор с помощью super() вызов
да можно вызвать один конструктор из другого, с использованием this()
ключевое слово этой можно использовать для вызова конструктора из конструктора, когда пишите несколько конструкторов для класса, бывают случаи, когда вы хотите вызвать один конструктор из другого для предотвращения дублирования кода.
Ниже приведена ссылка, по которой я объясняю другую тему о конструкторе и геттерах() и сеттерах (), и я использовал класс с двумя конструкторами. Надеюсь, объяснения и примеры помогут вам.
существуют шаблоны проектирования, которые охватывают необходимость сложной конструкции — если это не может быть сделано кратко, создайте заводской метод или заводской класс.
С последней java и добавлением lambdas легко создать конструктор, который может принимать любой код инициализации, который вы хотите.
Как в Java вызвать один конструктор из другого?
Можно ли вызвать конструктор из другого (в том же классе, а не из подкласса)? Если да, то как? И как лучше всего вызвать другой конструктор (если есть несколько способов сделать это)?
Я считаю, что посылка вашего вопроса неверна. Вместо вызова конструктора внутри конструктора используйте шаблон Factory. Статический фабричный метод сначала создает все объекты нижнего уровня. Затем он создает объекты более высокого уровня, которые получают результаты от вызова фабрики. Этот метод устраняет сложность модели, что способствует поддержанию, ясности и тестированию. — David Medinets
Я обычно переключался на частные конструкторы и фабричные методы, поскольку конструкторы из-за своих ограничений нарушают принцип открытого-закрытого. Я думаю, что этот комментарий должен быть правильным ответом, все остальное запутает ваших товарищей по команде. — Richard
Срой, но это не очень хорошая практика, если вы хотите сделать что-то подобное, перезарядите конструктор. Если вы хотите обернуть контент, это можно сделать, но для другого файла pourpuse. Не конструктор открытого класса Foo
23 ответы
Да, это возможно:
Чтобы привязать к конкретному конструктору суперкласса вместо конструктора в том же классе, используйте super вместо this , Обратите внимание, что вы можете привязать только к одному конструкторуи это должен быть первый оператор в теле вашего конструктора.
Смотрите также этот связанный вопрос, который посвящен C #, но в нем применяются те же принципы.
ответ дан 23 мая ’17, 13:05
Итак, я предположил, что невозможно вызвать суперконструктор и другой конструктор того же класса, поскольку оба должны быть первой строкой? — гсингх2011
@ gsingh2011: Верно. Вы можете подключиться только к one другой конструктор. — Джон Скит
Это должно появиться в первой строке, но вы можете выполнять вычисления в конструкторе до его вызова: вы можете использовать статические методы в аргументах this () в первой строке и инкапсулировать любые вычисления, которые должны быть выполнены перед вызовом другому конструктору в этом статическом методе. (Я добавил это как отдельный ответ). — Кристиан Фрис
@ gsingh2011 Я знаю, что уже поздно, но вы можете вызвать перегруженный конструктор, используя this (. ), а затем в этом перегруженном конструкторе вы можете вызвать конструктор базового класса, используя super (. ) — Али
Я знаю, что опаздываю в раздел комментариев, но не понимаю, почему new Foo(1); не сработает? — Андрей
. this(args) . Предпочтительный шаблон — работать от самого маленького конструктора до самого большого.
Вы также можете использовать недавно отстаиваемый подход valueOf или просто «of»:
Чтобы вызвать суперкласс, используйте super(someValue) . Вызов super должен быть первым вызовом в конструкторе, иначе вы получите ошибку компилятора.
ответ дан 26 авг.
Если используется много параметров конструктора, подумайте о строителе. См. Пункт 2 книги Джошуа Блоха «Эффективная Java». — Коппор
Проблема с реализацией последнего подхода фабричным методом, newCons , заключается в том, что вы пытаетесь изменить состояние объекта, используя setArg1(. ) , поля которого, скорее всего, должны быть установлены как окончательные. Поскольку мы пытаемся сохранить как можно больше неизменяемых объектов, если не полностью, шаблон построителя решит эту проблему более правильно. — Йо Йо
@ RodneyP.Barbati В Java конструкторы с меньшей арностью часто вызывают конструкторы с большей арностью. а потом больше ничего не делай. если класс K имеет, например, два последних поля a, b, тогда «общий конструктор» будет K(A a, B b) < this.a = a; this.b = b; >. Тогда, если b имеет разумное значение по умолчанию, может быть конструктор с одним аргументом K(A a) < this(a, DEFAULT_B); >, и если есть значение по умолчанию a а также у нас есть конструктор по умолчанию: K() < this(DEFAULT_A); >. Это довольно распространенное соглашение в Java. — Джошуа Тейлор
@ RodneyP.Barbati Если у вас есть последнее поле (так что оно должно быть установлено), то конструктор по умолчанию должен будет установить его. Если ваши конструкторы с более высокой степенью арности вызывают конструктор по умолчанию (что должно быть сделано раньше, чем что-либо еще), то конструкторы с более высокой степенью арности никогда не имеют никаких параметров для установки любого из этих полей. — Джошуа Тейлор
[Примечание: я просто хочу добавить один аспект, который я не видел в других ответах: как преодолеть ограничения требования, чтобы this () был в первой строке).]
В Java другой конструктор того же класса может быть вызван из конструктора через this() . Однако обратите внимание, что this должен быть на первой строчке.
То, что this Должен появиться в первой строке выглядит большим ограничением, но вы можете создавать аргументы других конструкторов с помощью статических методов. Например:
Это правда, что вы можете вызывать статические методы таким образом, чтобы выполнять сложные вычисления для значений аргументов, и это нормально. Однако, если вы чувствуете, что код необходим до делегирования конструктора ( this(. ) ), то было бы разумно предположить, что где-то была сделана ужасная ошибка и что дизайн, возможно, нуждается в небольшом переосмыслении. — Инженер-программист
Я согласен, что очень сложное преобразование, вероятно, указывает на проблему дизайна. Но 1) есть несколько простых преобразований, для которых это может быть полезно — не все конструкторы являются просто линейной проекцией на другие и 2) может быть другая ситуация, когда эта информация может стать ручной, например, поддержка устаревшего кода. (Хотя я согласен с вашим выводом, я не понимаю, почему это оправдывает голосование против). — Кристиан Фрис
@ RodneyP.Barbati: Я вижу несколько проблем в том, чтобы делать это так, как вы это описываете: a) Делая это таким образом, невозможно проиллюстрировать использование статического метода в конструкторе (и это цель примера); -) и б) если вы сделаете это по-своему, поля не могут быть final (поля final можно инициализировать только один раз). — Кристиан Фрис
@ RodneyP.Barbati: Два других аспекта: c) Я считаю, что вы всегда должны выполнять инициализацию объекта в одной точке, которая должна быть самым общим конструктором. Если для инициализации объекта требуется сложная задача (инициализация объекта не является ленивой) или проверка или получение некоторых ресурсов (например, файла), то вам нравится делать это только один раз. И г) Добавление еще одного аргумента (например, аргумента 4), для которого инициализация зависит от значения аргумента 1 до аргумента 3, вам придется изменить все конструкторы в вашем случае, тогда как здесь вам нужно только добавить один и позволить 3-arg вызывать 4 -arg конструктор. — Кристиан Фрис
Для более общего метода преодоления ограничения «оператор должен быть первым в конструкторе» см. этот ответ. Это относится как к super() и this() звонки. — Джон МакКлейн
Когда мне нужно вызвать другой конструктор изнутри кода (не в первой строке), я обычно использую вспомогательный метод вроде этого:
Но чаще всего я пытаюсь сделать наоборот, вызывая более сложные конструкторы из более простых в первой строке, насколько это возможно. Для приведенного выше примера
ответ дан 24 апр.
Внутри конструктора вы можете использовать this ключевое слово для вызова другого конструктора в том же классе. Это называется явный вызов конструктора.
Вот еще один класс Rectangle, реализация которого отличается от реализации в разделе «Объекты».
Этот класс содержит набор конструкторов. Каждый конструктор инициализирует некоторые или все переменные-члены прямоугольника.

почему бы вам не вызвать второй конструктор, который Rectangle(int width, int height) in Rectangle() вместо Rectangle(int x, int y, int width, int height) ? — АНЯНА
@ RodneyP.Barbati Я не могу согласиться с этим. Этот шаблон не допускает полей final. — Wes
Как все уже сказали, вы используете this(…) , который называется явный вызов конструктора.
Однако имейте в виду, что внутри такого явного оператора вызова конструктора вы не можете ссылаться на
- Любой переменные экземпляра or
- Любой методы экземпляра or
- Любой внутренние классы объявлен в этом классе или любом суперклассе, или
- this or
- super .
Как указано в JLS (§8.8.7.1).
ответ дан 07 мая ’15, 23:05
Да, в классе может присутствовать любое количество конструкторов, и они могут быть вызваны другим конструктором, используя this() [Пожалуйста, не путайте this() вызов конструктора с this ключевое слово]. this() or this(args) должна быть первой строкой в конструкторе.
Это называется перегрузкой конструктора.
Обратите внимание, что для конструктора применима только концепция перегрузки, а не наследование или переопределение.
Да, можно вызывать один конструктор из другого. Но есть правило. Если вызов осуществляется от одного конструктора к другому, то
этот вызов нового конструктора должен быть первым оператором в текущем конструкторе
Таким образом, что-то подобное ниже не сработает.
Кроме того, в случае наследования, когда создается объект подкласса, сначала вызывается конструктор суперкласса.
Таким образом, в этом случае также сначала объявляется вызов другого конструктора перед любыми другими операторами.
ответ дан 22 авг.
Я расскажу вам простой способ
Существуют два типы конструкторов:
- Конструктор по умолчанию
- Параметризованный конструктор
Я объясню на одном примере
В приведенном выше примере я показал 3 типа звонков
- this () должен быть первым оператором в конструкторе
- Это безымянный объект. это автоматически вызывает конструктор по умолчанию. 3. Это вызывает параметризованный конструктор.
Примечание: это должен быть первый оператор в конструкторе.
ответ дан 19 дек ’17, 05:12

В основном методе у вас есть следующее: //это(); ошибка, потому что «должно быть первым оператором в конструкторе В этом утверждении нет особого смысла. Если вы пытаетесь сказать это это() нельзя вызвать изнутри основной метод, то да, это не может быть, потому что main статичен и не будет иметь ссылки на это() — SR Чайтанья
Вы можете создать конструктор из другого конструктора того же класса, используя ключевое слово this. Пример —
Вывод — строка как конструктор arg .. Конструктор по умолчанию .. int как конструктор arg ..