Java Урок 27: КЛАСС, конструктор

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

Скачать исходники для статьи можно ниже

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

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

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

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

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

 
/* В этом примере класс Box использует конструктор
для инициализации размеров параллелепипеда.
*/
class Box {
   double width;
   double height;
   double depth;
   // Это конструктор класса Box.
   Box() {
      System.out.println("Конструирование объекта Box");
      width = 10;
      height = 10;
      depth = 10;
   }
   // вычисление и возвращение объема
   double volume() {
      return width * height * depth;
   }
}

class BoxDemo1 {
   public static void main(String args[]) {
      // объявление, резервирование и инициализация объектов Box
      Box myboxl = new Box();
      Box mybox2 = new Box();
      double vol;
      // получение объема первого параллелепипеда
      vol = myboxl.volume();
      System.out.println("Объем равен " + vol);
      // получение объема второго параллелепипеда
      vol = mybox2.volume();
      System.out.println("Объем равен " + vol);
   }
}

Эта программа создает следующий вывод.

Конструирование объекта Box
Конструирование объекта Box
Объем равен 1000.0
Объем равен 1000.0.

Как видите, и объект myboxl, и объект mybox2 были инициализированы
конструктором Box() при их создании.
Поскольку конструктор присваивает всем параллелепипедам одинаковые размеры 10x10x10, объекты myboxl и mybox2 будут иметь одинаковый объем. Вызов метода println() внутри конструктора Box()служит исключительно иллюстративным целям.

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

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

переменная_класса = new имя_класса();

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

Box myboxl = new Box();

оператор new Box() вызывает конструктор Box().

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

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

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

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

Введите свой email адрес для того, чтобы подписаться на мой блог:


knopkisoc

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

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