Что такое конструктор по умолчанию java
Перейти к содержимому

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

  • автор:

Конструктор

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

Box myBox = new Box();

Добавим конструктор в класс Box сразу после переменных. Имя конструктора совпадает с именем класса, в котором он находится, а синтаксис аналогичен синтаксису метода. Конструкторы не имеют возвращаемого типа. Это объясняется тем, что неявно заданным возвращаемым типом конструктора класса является тип самого класса. В конструкторе мы устанавливаем значение 10 переменным класса:

public class Box < double width; double height; double depth; Box() < System.out.println("Конструирование объекта Вох"); width = 10; height = 10; depth = 10; >/** * Подсчитать объем коробки * * @return объем */ double getVolume() < return width * height * depth; >>
public class BoxDemo3 < public static void main(String[] args) < Box myBox1 = new Box(); Box myBox2 = new Box(); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); >> 

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

Первые примеры класса Box не определяли конструктора класса, но все же мы имели возможность создавать объекты. Как так получалось? Дело в том, что если конструктор класса не определен явно, то в Java для класса создается конструктор по умолчанию. Конструктор по умолчанию инициализирует все переменные экземпляра устанавливаемыми по умолчанию значениями. Но как только в классе будет определен собственный конструктор, конструктор по умолчанию больше не используется. Можно сказать, что класс с конструктором по умолчанию выглядит так:

public class Box < double width; double height; double depth; Box() < >. >

3. Конструктор с параметрами

Конструктор так же как и метод может принимать на вход параметры. Такие конструкторы еще называются параметризованными.

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

public class Box < double width; double height; double depth; /** * Конструктор класса Box * * @param w - щирина * @param h - высота * @param d - глубина */ Box(double w, double h, double d) < width = w; height = h; depth = d; >/** * Подсчитать объем коробки * * @return объем */ double getVolume() < return width * height * depth; >>

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

public class BoxDemo4 < public static void main(String[] args) < Box myBox1 = new Box(10, 20, 15); Box myBox2 = new Box(3, 6, 9); //Не можем использовать конструктор по умолчанию //Box myBox3 = new Box(); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); >> 

Для того чтобы закомментированная строка работала, просто добавим в класс Box еще один конструктор:

public class Box < double width; double height; double depth; /** * Конструктор класса Box * * @param w - щирина * @param h - высота * @param d - глубина */ Box(double w, double h, double d) < width = w; height = h; depth = d; >Box() < >/** * Подсчитать объем коробки * * @return объем */ double getVolume() < return width * height * depth; >>

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

  • Процедурное и объектно-ориентированное программирование
  • Принципы ООП
  • Классы и объекты
  • Ключевое слово this
  • Перегрузка
  • Стек и куча
  • Передача объектов в методы
  • Java varargs
  • Рекурсия
  • Сборщик мусора и метод finalize
  • Наследование
  • Ключевое слово super
  • Модификаторы доступа
  • Геттеры и сеттеры
  • Переопределение методов
  • Абстрактные классы и методы
  • Ключевое слово final
  • Задания

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

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

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

class ClassName < . // объявление конструктора ClassName() < // тело конструктора // . > . >
2. В каких случаях конструктор по умолчанию генерируется в классе автоматически а в каких нет? Пример

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

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

class CMyClass < int d; int GetD() < return d; > void SetD(int nd) < d = nd; > >

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

// работает, так как в классе больше не реализовано ни одного конструктора CMyClass mc = new CMyClass();

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

class CMyClass < int d; // объявление конструктора с 1 параметром, // конструктор по умолчанию уже не генерируется автоматически CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >

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

// ошибка компиляции, так как в классе уже объявлен другой конструктор // CMyClass mc = new CMyClass(); CMyClass mc2 = new CMyClass(7); // а этот код работает

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

The constructor CMyClass() is undefined

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

class CMyClass < int d; // явное объявление конструктора по умолчанию CMyClass() < d = 0; > // объявление конструктора с 1 параметром, CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >

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

CMyClass mc = new CMyClass(); // вызывается конструктор по умолчанию mc.d = 25; CMyClass mc2 = new CMyClass(5); // вызывается конструктор с 1 параметром
3. Вызов конструкторов из других конструкторов. Пример

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

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

// Класс, который реализует пиксел на экране монитора public class CPixel < // внутренние переменные класса  private int x, y; // координаты пиксела  private int color; // цвет пиксела // конструктор без параметров (конструктор по умолчанию) CPixel() < x = y = color = 0; > // конструктор с 2 параметрами, которые инициализируют только координаты CPixel(int _x, int _y) < x = _x; y = _y; color = 0; > // конструктор с 1 параметром, который инициализирует только цвет CPixel(int _color) < color = _color; x = y = 0; > // конструктор с 3 параметрами, который вызывает конструктор с 2 параметрами CPixel (int _x, int _y, int _color) < // вызов конструктора с 2 параметрами: обязательно первая операция и только один раз  this(_x, _y); //this(_color); // повторный вызов конструктора запрещен  this.color = _color; // так можно > // методы доступа int GetX() < return x; >  int GetY() < return y; >  int GetColor() < return color; > >

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

. CPixel cp1 = new CPixel(2,8); // вызов конструктора с 2 параметрами CPixel cp2 = new CPixel(3,5,8); // вызов конструктора, который вызовет другой конструктор int d; d = cp1.GetX(); // d = 2 d = cp2.GetColor(); // d = 8 d = cp2.GetY(); // d = 5 .
4. Какие ограничения (требования) накладываются на вызов других конструкторов из конструктора класса?

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

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

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

Связанные темы

  • Конструкторы . Параметризированные конструкторы. Ключевое слово this. «Сборка мусора». Метод finalize() . Примеры
  • Перегрузка методов в классах. Перегрузка конструкторов

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

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

В C++ и Java если нет явным образом опредёленных конструкторов в классе, то компилятор использует конструктор по умолчанию, опредёленный неявным способом, который аналогичен «чистому» [уточнить] конструктору по умолчанию. Поэтому, класс не гарантирует наличия конструктора по умолчанию (то есть когда программист явным образом определяет только конструктор, который не по умолчанию). Некоторые программисты явным образом задают конструктор по умолчанию по привычке, чтобы не забыть в дальнейшем, но это не обязательно. В C++ только массивы имеют конструкторы по умолчанию, которые создают каждый элемент при помощи конструктора по умолчанию для их типа.

В C++ и Java если производный класс не вызывает явным образом конструктор базового класса (в C++ в списке инициализации, в Java используя super() в первой строчке), то конструктор по умолчанию вызывается неявно. Если базовый класс не имеет конструктора по умолчанию, то это считается ошибкой. В C++ если поле экземпляра класса явным образом не инициализировано в списке, то вызывается конструктор по умолчанию для инициализации этого поля. Если такой тип не имеет конструктора по умолчанию, то это также считается ошибкой.

  • Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
  • Дополнить статью (статья слишком короткая либо содержит лишь словарное определение).
  • Викифицировать статью.
  • Метод (информатика)

Wikimedia Foundation . 2010 .

  • Конструктор копирования
  • Конструкторское бюро специального машиностроения

Полезное

Смотреть что такое «Конструктор по умолчанию» в других словарях:

  • конструктор по умолчанию — Конструктор, создаваемый компилятором при отсутствии конструктора класса. [ГОСТ Р 54456 2011] Тематики телевидение, радиовещание, видео EN default constructor … Справочник технического переводчика
  • Конструктор (программирование) — У этого термина существуют и другие значения, см. Конструктор. В объектно ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) специальный блок инструкций, вызываемый при создании объекта.… … Википедия
  • Конструктор класса — В объектно ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) специальный блок инструкций, вызываемый при создании объекта, причём или при его объявлении (располагаясь в стеке или в статической… … Википедия
  • Конструктор объекта — В объектно ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) специальный блок инструкций, вызываемый при создании объекта, причём или при его объявлении (располагаясь в стеке или в статической… … Википедия
  • Конструктор копирования — Конструктором копирования (в англоязычной литературе используется термин copy constructor) называется специальный конструктор в языке программирования C++, применяемый для создания нового объекта как копии уже существующего. Такой конструктор… … Википедия
  • Нуль-арный конструктор — В компьютерном программировании нуль арным конструктором (в англ. языке используется термин nullary constructor) называют конструктор, не принимающий аргументы. Содержание 1 Объектно ориентированные конструкторы 1.1 … Википедия
  • C++0x — C++0x будущая версия стандарта языка C++, вместо ныне существующего ISO/IEC 14882:2003. Новый стандарт будет включать дополнения в ядре языка и расширение STL, включая большую часть TR1 кроме, вероятно, библиотеки специальных… … Википедия
  • Стандартная библиотека шаблонов — Стандартная библиотека языка программирования C++ fstream iomanip ios iostream sstream Стандартная библиотека шаблонов … Википедия
  • Standard Template Library — Стандартная библиотека шаблонов (STL) (англ. Standard Template Library) набор согласованных обобщенных алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций. Стандартная библиотека шаблонов до включения в… … Википедия
  • C++11 — C++11[1][2] или ISO/IEC 14882:2011[3] (в процессе работы над стандартом носил условное наименование C++0x[4][5]) новая версия стандарта языка C++, вместо ранее действовавшего ISO/IEC 14882:2003. Новый стандарт включает дополнения в ядре… … Википедия
  • Обратная связь: Техподдержка, Реклама на сайте
  • �� Путешествия

Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.

  • Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
  • Искать во всех словарях
  • Искать в переводах
  • Искать в ИнтернетеИскать в этой же категории

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

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

  () // заголовок конструктора < // тело конструктора   >

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

  • Модификаторы, кроме модификаторов доступа, недопустимы в заголовке конструктора.
  • Конструктор не может возвращать значение, поэтому не может и задавать в заголовке возвращаемый тип, даже void , но простая форма оператора return может содержаться в теле конструктора.
  • Имя конструктора должно быть таким же, как и имя класса.

Имена классов и методов находятся в разных пространствах имен. Поэтому в примере 4.5 не будет конфликта имен, где метод, объявленный в строке (2), имеет такое же имя, как и конструктор, объявленный в строке (1). Однако использование подобной схемы именования строго не рекомендуется.

Пример 4.5. Пространство имен

public class Name < Name() < // (1) System.out.println("Constructor"); >void Name() < // (2) System.out.println("Method"); >public static void main(String[] args) < new Name().Name(); // (3) за вызовом конструктора следует вызов метода >>
Constructor Method

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

Конструктор по умолчанию — это конструктор без каких-либо параметров. Другими словами, он имеет следующую сигнатуру:

Если в классе не задано ни одного конструктора, то предоставляется неявный конструктор по умолчанию. Неявный конструктор по умолчанию эквивалентен следующей реализации:

() < super(); >// нет параметров, вызывает конструктор суперкласса.

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

В следующем коде класс Light не определяет никаких конструкторов.

class Light < // поля int noOfWatts; // Мощность boolean indicator; // Включено или выключено String location; // Размещение // нет конструкторов //. >class Greenhouse < // . Light oneLight = new Light(); // (1) вызов неявного конструктора по умолчанию >

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

Light()

При создании объекта при помощи оператора new с использованием конструктора по умолчанию, как в строке (1), поля объекта будут проинициализированы соответствующими значениями по умолчанию (т.е. поля noOfWatts , indicator и location в объекте Light будут проинициализированы 0 , false и null соответственно).

Класс может самостоятельно предоставить реализацию конструктора по умолчанию. В следующем примере класс Light явно определяет в строке (1) конструктор по умолчанию. Обратите внимание, что он имеет такое же имя, как и класс, и не получает никаких параметров.

class Light < // . // Explicit Default Constructor Light() < // (1) noOfWatts = 50; indicator = true; location = "X"; >//. > class Greenhouse < // . Light extraLight = new Light(); // (2) Вызов явного конструктора по умолчанию >

Наличие явного конструктора по умолчанию гарантирует, что в любом объекте, созданном с помошью выражения new Light() , как в строке (2), значения полей noOfWatts , indicator и location будут установлены в 50 , true и «X» соответственно.

Если в классе определены какие-либо явные конструкторы, то он не может больше полагаться на неявный конструктор по умолчанию, для установки состояния объектов. Если в таком классе требуется конструктор по умолчанию, то должна быть его реализация. В примере ниже в классе Light задан только конструктор не по умолчанию (1). Он вызывается в строке (2), когда с помощью оператора new создается объект класса light . Любая попытка вызова конструктора по умолчанию будет обозначена как ошибка на этапе компиляции, как показано в строке (3).

class Light < // . // Только конструктор не по умолчанию Light(int noOfWatts, boolean indicator, String location) < // (1) this.noOfWatts = noOfWatts; this.indicator = indicator; this.location = location; >//. > class Greenhouse < // . Light moreLight = new Light(100, true, "Greenhouse"); // (2) OK. // Light firstLight = new Light(); // (3) Ошибка на этапе компиляции >

Перегруженные конструкторы

Как и методы, конструкторы также могут быть перегружены. Так как все конструкторы в классе имеют такое же имя, как и имя класса, то их сигнатуры различаются по их спискам параметров. В следующем примере класс Light поддерживает как явную реализацию конструктора по умолчанию в строке (1), так и конструктор не по умолчанию (2). Конструкторы перегружены, как явно следует из их сигнатур. Конструктор не по умолчанию вызывается, когда создается объект класса Light в строке (3), подобным же образом вызывается и конструктор по умолчанию в строке (4).

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

class Light < // . // Явный конструктор по умолчанию Light() < // (1) noOfWatts = 50; indicator = true; location = "X"; >// Конструктор не по умолчанию Light(int noOfWatts, boolean indicator, String location) < // (2) this.noOfWatts = noOfWatts; this.indicator = indicator; this.location = location; >//. > class Greenhouse < // . Light moreLight = new Light(100, true, "Greenhouse"); // (3) OK. Light firstLight = new Light(); // (4) OK. >

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

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