Можно ли в классе вызвать один конструктор из другого как это сделать java

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

Конструкторы. Конструкторы по умолчанию. Вызов конструкторов класса из других конструкторов

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

В наиболее общем случае, для класса ClassName , конструктор по умолчанию имеет следующий вид:

2. В каких случаях конструктор по умолчанию генерируется в классе автоматически а в каких нет? Пример

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

Например. В следующем объявлении класса конструктор по умолчанию генерируется автоматически

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

Если в тело класса CMyClass добавить хотя бы один другой конструктор (например, конструктор с одним параметром), то конструктор по умолчанию автоматически генерироваться не будет

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

В результате выполнения вышеприведенной строки будет выдана ошибка компиляции:

The constructor CMyClass() is undefined

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

После такой реализации можно создавать экземпляр класса с использованием двух конструкторов, например

3. Вызов конструкторов из других конструкторов. Пример

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

Пример. В примере демонстрируется использование класса CPixel , который реализует пиксел на экране монитора.

Использование класса CPixel в другом программном коде (методе)

4. Какие ограничения (требования) накладываются на вызов других конструкторов из конструктора класса?

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

  • вызвать можно только один другой конструктор класса. Вызвать два и больше других конструктора этого класса запрещено. Это вытекает из логики, что конструктор класса предназначен для создания объекта класса только один раз (а не два и больше раза);
  • вызов другого конструктора должен быть первой операцией в вызывающем конструкторе. Если в вызывающем конструкторе вызов другого конструктора реализовать второй (третьей и т.д.) операцией, то компилятор выдаст ошибку.
5. Можно ли вызвать конструктор из обычного метода класса?

Нет, нельзя. Конструктор класса может вызваться только из другого конструктора этого же класса. Главное назначение конструктора класса – создание экземпляров (объектов) класса. Этих привилегий лишены методы класса.

Как вызвать один конструктор из другого в Java?

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

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

используя this(args) . Предпочтительным шаблоном является работа от самого маленького конструктора до самого большого.

вы также можете использовать более недавно пропагандируемый подход valueOf или просто "of":

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

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

в Java другой конструктор того же класса может быть вызван из конструктора через this() . Обратите внимание, однако, что this должно быть на первой строке.

Это this должен появиться на первой линии выглядит как большое ограничение, но вы можете построить аргументы других конструкторов с помощью статических методов. Например:

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

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

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

вот еще один класс Rectangle с другой реализацией, отличной от реализации в разделе Objects.

этот класс содержит набор конструкторов. Каждый конструктор инициализирует некоторые или все переменные-члены прямоугольника.

как все уже сказали, вы используете this(…) , которая называется явный вызов конструктора.

Однако имейте в виду, что внутри такого явного оператора вызова конструктора вы не можете ссылаться на

  • любой переменные или
  • любой методы экземпляра или
  • любой внутренние классы объявлено в этом классе или любом суперкласс, или
  • this или
  • super .

как указано в JLS (§8.8.7.1).

Я скажу вам простой способ

здесь два типы конструкторов:

я объясню в одном примере

в приведенном выше примере я показал 3 типа вызова

  1. этот вызов () должен быть первым оператором в конструкторе
  2. это название меньше возражений. это автоматически вызывает конструктор по умолчанию. 3.Это вызывает параметризованный конструктор.

Примечание.: это должен быть первый оператор в конструкторе.

да, любое количество конструкторов может присутствовать в классе, и они могут быть вызваны другим конструктором с помощью this() [пожалуйста, не путайте this() вызов конструктора с this ключевое слово]. this() или this(args) должна быть первая строка в конструкторе.

это известно как перегрузка конструктора.
Обратите внимание, что для конструктора применима только концепция перегрузки, а не наследование или переопределение.

Да можно вызвать один конструктор из другого. Но есть одно правило. Если вызов выполняется из одного конструктора в другой, то

этот новый вызов конструктора должен быть первым оператором в текущем конструкторе

Так, что-то вроде ниже не получится.

кроме того, в случае наследования при создании объекта подкласса сначала создается конструктор суперкласса называемый.

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

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

выход — строка как конструктор arg.. Конструктор по умолчанию.. int как конструктор arg..

вызов конструктора из другого конструктора

Также вы можете вызвать родительский конструктор с помощью super() вызов

да можно вызвать один конструктор из другого, с использованием this()

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

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

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

С последней java и добавлением lambdas легко создать конструктор, который может принимать любой код инициализации, который вы хотите.

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

Зачем нужны конструкторы? - 2

Конструктор успешно присвоил нужные значения. Ты, возможно, заметил, что конструктор очень похож на обычный метод! Так оно и есть: конструктор — это метод, только немного специфичный 🙂 Так же как в метод, в наш конструктор мы передали параметры. И так же как вызов метода, вызов конструктора не сработает, если их не указать: Видишь, конструктор сделал то, чего мы пытались добиться. Теперь нельзя создать машину без скорости или без модели! На этом сходство конструкторов и методов не заканчивается. Так же, как и методы, конструкторы можно перегружать. Представь, что у тебя дома живут 2 кота. Одного из них ты взял еще котенком, а второго ты принес домой с улицы уже взрослым и не знаешь точно, сколько ему лет. Значит, наша программа должна уметь создавать котов двух видов — с именем и возрастом для первого кота, и только с именем — для второго кота. Для этого мы перегрузим конструктор: К изначальному конструктору с параметрами “имя” и “возраст” мы добавили еще один, только с именем. Точно так же мы перегружали методы в прошлых уроках. Теперь мы успешно можем создать оба варианта котов 🙂 Помнишь, в начале лекции мы говорили, что ты уже пользовался конструкторами, только сам не замечал этого? Так и есть. Дело в том, что у каждого класса в Java есть так называемый конструктор по умолчанию. У него нет никаких аргументов, но он срабатывает каждый раз при создании любого объекта любого класса. На первый взгляд это незаметно. Ну создали объект и создали, где тут работа конструктора? Чтобы это увидеть, давай прямо руками напишем для класса Cat пустой конструктор, а внутри него выведем какую-нибудь фразу в консоль. Если она выведется, значит конструктор отработал. Вывод в консоль:

Зачем нужен конструктор? - 3

Вот и подтверждение! Конструктор по умолчанию всегда незримо присутствует в твоих классах. Но тебе нужно знать еще одну его особенность. Дефолтный конструктор исчезает из класса, когда ты создаешь какой-то конструктор с аргументами. Доказательство этого, на самом деле, мы уже видели выше. Вот в этом коде: Мы не смогли создать кота без имени и возраста, потому что определили конструктор для Cat : строка + число. Дефолтный конструктор сразу после этого исчез из класса. Поэтому обязательно запомни: если тебе в твоем классе нужно несколько конструкторов, включая пустой, его нужно создать отдельно. Например, мы создаем программу для ветеринарной клиники. Наша клиника хочет делать добрые дела и помогать бездомным котикам, про которых мы не знаем ни имени, ни возраста. Тогда наш код должен выглядеть так: Теперь, когда мы явно прописали конструктор по умолчанию, мы можем создавать котов обоих типов 🙂 Для конструктора (как и для любого метода) очень важен порядок следования аргументов. Поменяем в нашем конструкторе аргументы имени и возраста местами. Ошибка! Конструктор четко описывает: при создании объекта Cat ему должны быть переданы число и строка, именно в таком порядке. Поэтому наш код не срабатывает. Обязательно запомни это и учитывай при создании своих собственных классов: Это два абсолютно разных конструктора! Если выразить в одном предложении ответ на вопрос “Зачем нужен конструктор?”, можно сказать: для того, чтобы объекты всегда находились в правильном состоянии. Когда ты используешь конструкторы, все твои переменные будут корректно проинициализированы, и в программе не будет машин со скоростью 0 и прочих “неправильных” объектов. Их использование очень выгодно прежде всего для самого программиста. Если ты будешь инициализировать поля самостоятельно, велик риск что-нибудь пропустить и ошибиться. А с конструктором такого не будет: если ты передал в него не все требуемые аргументы или перепутал их типы, компилятор сразу же выдаст ошибку. Отдельно стоит сказать о том, что внутрь конструктора не стоит помещать логику твоей программы. Для этого в твоем распоряжении есть методы, в которых ты можешь описать весь нужный тебе функционал. Давай посмотрим, почему логика в конструкторе — это плохая идея: У нас есть класс CarFactory , описывающий фабрику по производству автомобилей. Внутри конструктора мы инициализируем все поля, и сюда же помещаем логику: выводим в консоль некоторую информацию о фабрике. Казалось бы — ничего плохого в этом нет, программа прекрасно отработала. Вывод в консоль:

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

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

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

Как вызвать конструктор в Java?

Вы можете вызвать другой конструктор с помощью ключевого слова this(. ) (когда вам нужно вызвать конструктор из того же класса) или ключевого слова super(. ) (когда вам нужно вызвать конструктор из суперкласса). Однако такой вызов должен быть первым оператором вашего конструктора.

Что такое перегруженный конструктор Java?

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

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

Как вызвать конструктор суперкласса Java?

2. Вызов конструкторов супер класса с помощью ключевого слова super. Если в иерархии классов требуется передать параметры конструктору супер класса, то все подклассы должны передавать эти параметры вверх по иерархии. То есть из конструктора подкласса надо вызвать конструктор супер класса с помощью super() .

Для чего нужен конструктор по умолчанию?

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

Зачем нужен конструктор по умолчанию С ++?

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

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

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

Как вызвать один конструктор из другого Java?

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

Как и в каком месте можно вызвать из одного конструктора другой конструктор этого же класса Java?

В Java другой конструктор того же класса можно вызвать из конструктора через this() . Обратите внимание, однако, что this должно быть в первой строке.

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

Вы можете вызвать один конструктор из другого в том же классе, или в надклассе, со следующими ограничениями: . Вызываемый конструктор должен быть в первой строке кода в вызывающем конструкторе. Вложенный конструктор не может иметь никакой явной или неявной ссылки на "this".

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

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

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

Приватный конструктор запрещает создание экземпляра класса вне методов самого класса, например, что гарантировать существование только одного объекта определённого класса, предположим какого-то ресурса, например БД. . Модификатор доступа private определяет доступ в рамках данного класса, где вы можете создавать объекты.

Что такое перегрузка в Java?

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

На предыдущем занятии мы увидели как объявляются классы и создаются их экземпляры с помощью оператора:

ссылка = new имя_класса();

В частности, вот такой строчкой:

создавали объект класса Point:

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


Но у нас в классе Point нет никаких методов, там объявлены только две переменные x, y. Все так, но в Java в любой класс автоматически добавляет конструктор по умолчанию, если явно не записаны никакие другие конструкторы. Именно этот конструктор по умолчанию и вызывался при создании объектов класса Point.

Чтобы все было понятнее, давайте объявим свой конструктор в этом классе. Для этого используется такой синтаксис:

имя_класса([аргументы]) <
// тело конструктора (набор операторов)
>

И в нашем случае его можно прописать так:

Смотрите, мы указываем, что при создании нового экземпляра класса, значения полей x, y будут равны -1. Проверим это, создадим объект и выведем значения координат в консоль:

Отображаются -1. Это как раз следствие работы конструктора, который мы прописали в классе. При этом, конструктор по умолчанию больше не существует и остается только тот, что мы указали.

А что если мы захотим прописать два конструктора и к существующему добавить еще один:

Так тоже можно делать. Теперь наш класс содержит оба конструктора и мы можем вызывать любой из них при создании объектов:

Это называется перегрузкой конструкторов, когда в одном классе несколько конструкторов с разными аргументами. На практике это используется довольно часто.

Ключевое слово this

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

Очевидно, что здесь x, y будут восприниматься как локальные аргументы и никакого отношения к переменным класса x, y они не будут иметь. Но, можно ли как то явно указать, что мы хотим обратиться именно к полям объекта, а не к аргументам конструктора? Да, можно, и делается это с помощью специального ключевого слова this:

По смыслу this – это ссылка на текущий экземпляр объекта. То есть, если нам внутри самого объекта требуется оперировать ссылкой на него, то для этого используется ключевое слово this. Мало того, через this можно вызывать один конструктор из другого. Например, добавим в класс Point еще одно поле color – цвет точки. И будем по умолчанию инициализировать его нулем:

Смотрите что получается. У нас конструкторах происходит дублирование кода. Это плохой стиль программирования. Чтобы этого избежать, можно во втором конструкторе вызвать сначала первый для начальной инициализации полей, а затем, изменить значения координат x, y:

Вот эта строчка this(); как раз выполняет вызов первого конструктора перед изменением полей x, y. В результате, никакого дублирования не происходит. Вот так двояко можно применять ссылку this: и для доступа к полям текущего объекта, и для вызова конструкторов.

Инициализаторы

Давайте еще раз внимательно посмотрим на пример нашего класса и зададимся вопросом: что делает первый конструктор без аргументов? Фактически, он выполняет начальную инициализацию полей класса Point. Именно поэтому мы его отдельно вызываем во втором конструкторе. Но это не лучший ход. В классах языка Java можно создавать специальный блок, который так и называется – инициализатор. Он автоматически выполняется один раз при создании объекта до вызова конструкторов. Записывается инициализатор следующим образом:

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

Глядя на первый конструктор, в котором нет никакой реализации, возникает соблазн его попросту убрать из класса Point. Давайте попробуем это сделать и посмотрим к чему это приведет:

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

Путь кодера

Подвиг 1. Объявить класс Rect для представления прямоугольника, в котором хранятся две координаты: верхнего левого и правого нижнего углов. Реализовать три конструктора: первый – без аргументов; второй с четырьмя аргументами для двух координат; третий – с четырьмя аргументами (координата левого верхнего угла, ширина и высота). Создать несколько экземпляров с вызовом разных конструкторов и выводом значений полей в консоль.

Подвиг 2. Объявить класс Triangle, хранящий три координаты вершин. Координаты представить в виде ссылок на класс Point, который рассмотрен на этом занятии. Реализовать два конструктора: без аргументов и с шестью аргументами (по два на каждую координату). Создать два объекта, вывести координаты вершин по каждому объекту в консоль.

Подвиг 3. Объявить класс Line для представления линии на плоскости, хранящий две координаты: начало и конец линии. Создать два объекта этого класса и в функции main() определить: пересекаются ли эти две линии.

Видео по теме



















© 2022 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

На Javarush есть задача со следующими требованиями:
1. У класса должно быть 3 конструктора.
2. Конструктор с двумя параметрами должен инициализировать переменные x и y переданными значениями.
3. Конструктор с двумя параметрами должен инициализировать переменную radius значением 10.
4. Конструктор с двумя параметрами должен должен вызывать другой конструктор, передав в него верные значения параметров.

Сервер не засчитывает выполнение программы по пункту 4. Подскажите, что я не так делаю с вызовом this(x, y, 10.0)?

public class Circle

Вызов конструктора
Хочу сделать программу на GUI, что-бы она высчитывала квадратное уровнение. Есть код. import.


Не могу создать ссылку на переменную String с конструктора JFrame
Нужно создать ссылку в другом классе на переменную , которая находиться в "public void.

Вызов конструктора из конструктора - ошибка
Айм водеринг. Но разве из одного конструктора нельзя вызвать другой (из StadoOvechek() вызвать.

Читайте также: