Java Урок 29: КЛАСС, перегрузка конструкторов

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

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

Чтобы это утверждение было понятным, рассмотрим пример:

class Box {
   double width;
   double height;
   double depth;
   // Это конструктор класса Box.
   Box(double w, double h, double d) {
      width = w;
      height = h;
      depth = d;
   }
   // вычисление и возврат значения
   double volume() {
      return width * height * depth;
   }
}

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

Box ob = new Box();

Поскольку конструктор Box() требует передачи трех аргументов, его вызов без аргументов — ошибка. Эта ситуация порождает три важных вопроса.
Что, если нужно было просто определить параллелепипед, и его начальные размеры не имели значения (или не были известны)?
Или нужно иметь возможность инициализировать куб, указывая только один размер, который должен использоваться для всех трех измерений?
При текущем определении класса Box все эти дополнительные возможности недоступны.

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

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

/* В этом примере класс Box определяет три конструктора для
инициализации размеров параллелепипеда различными способами.
*/
class Box {
   double width;
   double height;
   double depth;
   // конструктор, используемый при указании всех измерений
   Box(double w, double h, double d) {
      width = w;
      height = h;
      depth = d;
   }
   // конструктор, используемый, когда ни один из размеров не указан
   Box() {
      width = -1; // значение -1 используется для указания
      height = -1; // неинициализированного
      depth = -1; // параллелепипеда
   }
   // конструктор, используемый при создании куба
   Box(double len) {
      width = height = depth = len;
   }
   // вычисление и возврат объема
   double volume() {
      return width * height * depth;
   }
}

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

Эта программа создает следующий вывод:
Объем myboxl равен 3 000.0
Объем mybox2 равен -1.0
Объем mycube равен 343.0

Как видите, соответствующий перегруженный конструктор вызывается в зависимости от параметров, указанных при выполнении оператора new.

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


knopkisoc

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>