что такое конструктор по умолчанию java

BestProg

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

Содержание

Поиск на других ресурсах:

1. Понятие конструктора по умолчанию

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

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

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

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

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

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

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

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

The constructor CMyClass() is undefined

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

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

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

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

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

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

5. Можно ли вызвать конструктор из обычного метода класса?

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

Источник

Конструктор

Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения.

В отличие от метода, конструктор никогда ничего не возвращает.

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

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

Мы временно удалили метод setDim() и добавили конструктор. Посмотрим, что получится:

Программа выведет объём коробки, хотя мы не задавали никаких размеров для неё. Благодаря конструктору любая создаваемая коробка будет иметь какой-то зафиксированный объём.

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

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

Подобно любому методу, у конструктора могут быть аргументы. В аргументах конструктора передаются параметры для инициализации объекта. Например, если у класса Cat имеется конструктор, который получает в качестве аргумента целое число, обозначающее возраст кота, то объекты Cat будут создаваться следующим образом:

Если Cat(int) является единственным конструктором класса, то компилятор не позволит создавать объекты Cat каким-либо другим способом.

Однако вернёмся к коробкам для котов. Созданный нами конструктор не особо полезен, так как создаёт одинаковые коробки. Создадим конструктор с параметрами в классе Box и закомментируйте первый конструктор без параметров:

Если класс содержит один конструктор с параметрами, то вам придётся обязательно указать значения при объявлении класса:

Кстати, с таким конструктором метод setDim() нам уже не нужен. Мы можем задать размеры коробки сразу в конструкторе. Так как скорее всего коробка постоянна и не меняет своих размеров, то метод, пожалуй, лишний. Но если мы будем менять размеры коробки, то метод придётся оставить.

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

Например, мы можем создать ещё один конструктор специально для коробки в виде куба, где все стороны равны:

Вычисляем размер куба:

Используем объект в качестве параметров

Мы пока использовали в качестве параметров в конструкторах простые типы. Но можно передать и объект самого класса. Добавим ещё один конструктор:

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

Класс Box (исходник)

Вызов перегруженных конструкторов через this()

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

Для начала создадим класс, который не использует конструктор this(), чтобы понять разницу.

Мы создали класс с тремя конструкторами. Перепишем класс, используя конструктор this().

Вызов конструктора Cat(8) приводит к выполнению конструктора this(8, 8), что равнозначно вызову конструктора Cat(8, 8).

Что происходит при выполнении оператора:

В этом случае вызывается конструктор this(0), что приводит к выполнению конструктора Cat(0), поскольку именно эта версия конструктора подходит по списку параметров. При этом конструктор Cat(0) по сути вызывает конструктор Cat(0, 0).

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

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

Закрытый конструктор

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

Строка throw new AssertionError() не является обязательной, но она поможет выявить ошибку, если вы вызовете конструктор в самом классе. Компилятор пропустит такой вариант, но программа завершится с ошибкой.

Подкласс для данного класса вы создать не сможете.

Источник

Создание объектов и конструкторы

Разбираем основные моменты, связанные с написанием собственных конструкторов классов в Java.

что такое конструктор по умолчанию java. Смотреть фото что такое конструктор по умолчанию java. Смотреть картинку что такое конструктор по умолчанию java. Картинка про что такое конструктор по умолчанию java. Фото что такое конструктор по умолчанию java

что такое конструктор по умолчанию java. Смотреть фото что такое конструктор по умолчанию java. Смотреть картинку что такое конструктор по умолчанию java. Картинка про что такое конструктор по умолчанию java. Фото что такое конструктор по умолчанию java

Процесс создания объектов — один из важных аспектов программирования на Java. Под созданием подразумевают как минимум две основные операции: создание нового объекта класса и инициализацию полей объекта.

В этой статье мы рассмотрим:

что такое конструктор по умолчанию java. Смотреть фото что такое конструктор по умолчанию java. Смотреть картинку что такое конструктор по умолчанию java. Картинка про что такое конструктор по умолчанию java. Фото что такое конструктор по умолчанию java

Программист, преподаватель Skillbox. Пишет про Java.

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

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

Самый простой способ создать объект — это строка вида:

Рассмотрим порядок создания объекта. В этой строке выполняется три действия:

Приведённый выше код можно разбить на две строки:

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

В первой строке кода переменная murka объявляется как ссылка на объект типа Cat. Здесь важно понять, что объектная переменная фактически не содержит никакого объекта. Значение любой объектной переменной в Java представляет собой ссылку на объект, размещённый в памяти. В данный момент переменная murka пока ещё не ссылается на объект (содержит пустое значение null).

Во второй строке кода создаётся новый объект типа Cat, а ссылка на него присваивается переменной murka. С этого момента переменная murka оказывается ассоциированной с объектом. Чтобы работать с объектами, нужно сначала создать их и задать их исходное состояние. Затем к этим объектам можно применять методы.

Теперь взглянем на код класса Cat (без методов):

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

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

Для справки: Для числовых типов данных значением по умолчанию является нулевое, для типа boolean — логическое значение false, а для ссылочных типов — пустое значение null.

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

Сразу отметим, что полагаться на действия по умолчанию не следует. Если поля инициализируются неявно, программа становится менее понятной.

Как работают параметризованные конструкторы

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

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

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

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

Разберём пример применения параметризованного конструктора класса Cat с добавленным полем имени:

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

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

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

Важно: вызов другого конструктора всегда должен стоять первой строкой в конструкторе.

Вот пример оптимизации кода первого из конструкторов:

Обратите внимание: Несколько слов насчёт ключевого слова this. Синтаксис языка Java не запрещает использовать имена параметров или локальных переменных, совпадающие с именами переменных экземпляра (класса). В таком случае говорят, что локальная переменная или параметр скрывает переменную экземпляра. При этом доступ к скрытой переменной экземпляра обеспечивается с помощью ключевого слова this.

Приведённый ниже пример конструктора класса Cat показывает, каким образом лучше выполнять присваивание переданных в конструктор параметров переменным класса:

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

Но в целом читаемость кода — это отдельная и довольно обширная тема.

Инициализация полей объекта

Основная задача конструкторов — подготовка объекта к работе с ним и установка значений для полей (переменных) объекта. Но есть и другие варианты установки значения для полей. Это явная инициализация и так называемые блоки инициализации.

Явная инициализация — это возможность присвоить полю соответствующее значение указанным ниже образом:

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

Блоки инициализации выглядят так:

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

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

Что в итоге

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

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

3. Выполняется тело конструктора.

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

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

На заметку: важный момент, о котором часто забывают при написании собственных конструкторов, — в конструкторах не должно содержаться никакой бизнес-логики. Их задача — корректное создание объектов и подготовка их к дальнейшему использованию. Вся логика должна находиться в соответствующих методах.

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

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

Источник

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

11 ответов

ни один из них. Если вы определяете его, это не значение по умолчанию.

Это точно так же, как

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

уточнение

технически это не конструктор (по умолчанию или иначе), что по умолчанию инициализирует поля. Однако я оставляю это в ответе как

конструктор по умолчанию создается, если вы не определяете конструкторы в своем классе. Это просто конструктор аргументов no, который ничего не делает. Edit: кроме вызова super ()

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

Per Спецификация Языка Java Третье Издание:

8.8.9 Конструктор По Умолчанию

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

Привет. Согласно моим знаниям, позвольте мне очистить концепцию конструктора по умолчанию:

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

Я прочитал эту информацию из Java Учебники.

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

единственным действием неявного конструктора по умолчанию является вызов конструктора суперкласса с помощью вызова super (). Аргументы конструктора предоставить вам способ передачи параметров для инициализации объекта.

Ниже приведен пример класса Куба, содержащего 2 конструктора. (один по умолчанию и конструктор с параметрами).

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

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

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

будет автоматически изменен (путем добавления конструктора по умолчанию) следующим образом

и когда вы создаете это объект

этот конструктор по умолчанию вызывается.

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

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

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

цель добавления конструктора по умолчанию:

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

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

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

конструктор по умолчанию не принимает никаких аргументов:

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

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

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

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

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

конструктор по умолчанию значения по умолчанию для объекта, как Ноль, значение null и т. д. в зависимости от типа.

пожалуйста см. ниже связь для больше деталей.

Источник

Классы. Объектно-ориентированное программирование

Классы и объекты

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

Класс определяется с помощью ключевого слова сlass :

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

Теперь используем данный класс. Для этого определим следующую программу:

Как правило, классы определяются в разных файлах. В данном случае для простоты мы определяем два класса в одном файле. Стоит отметить, что в этом случае только один класс может иметь модификатор public (в данном случае это класс Program), а сам файл кода должен называться по имени этого класса, то есть в данном случае файл должен называться Program.java.

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

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

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

В итоге мы увидим на консоли:

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

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

Консольный вывод программы:

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

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

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

Так, в данном случае указываем, что значение параметра name присваивается полю name.

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

В итоге результат программы будет тот же, что и в предыдущем примере.

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *