Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




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

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

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

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

Пример класса Box можно изменить, чтобы значения размеров параллелепипеда присваивались при конструировании объекта. Для этого потребуется заменить метод setDim() конструктором. Вначале определим простой конструктор, который просто устанавливает одинаковые значения размеров для всех параллелепипедов. Эта версия программы имеет вид:

/* В этом примере класс 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 BoxDemo6 {

public static void main(String args[]) {

// объявление, распределение и инициализация объектов Box

Box mybox1 = new Box();

Box mybox2 = new Box();

double vol;

// получение объема первого параллелепипеда

vol = mybox1. volume();

System. out. println(" Объем равен " + vol);

// получение объема второго параллелепипеда

vol = mybox2. volume();

System. out. println(" Объем равен " + vol);

}

}

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

Конструирование объекта Box

Конструирование объекта Box

Объем равен 1000. 0

Объем равен 1000. 0

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

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

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

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

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

Box mybox1 = new Box();

, операция new Box() вызывает конструктор Box(). Если конструктор класса не определен явно, Java создает для класса конструктор, который будет использоваться по умолчанию.

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

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

Хотя в предыдущем примере конструктор Box() инициализирует объект Box, он не особенно полезен – все параллелепипеды получают одинаковые размеры. Следовательно, необходим способ конструирования объектов Box с различными размерами. Простейшее решение этой задачи – добавление к конструктору параметров. Как легко догадаться, это делает конструктор значительно более полезным. Например, следующая версия класса Box определяет конструктор с параметрами, который устанавливает размеры параллелепипеда в соответствии со значениями этих параметров. Обратите особое внимание на способ создания объектов Box.

/* В этой программе класс Box использует конструктор с параметрами

для инициализации размеров параллелепипеда.

*/

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;

}

}

class BoxDemo7 {

public static void main(String args[]) {

// объявление, распределение и инициализация объектов Box

Box mybox1 = new Box(10, 20, 15);

Box mybox2 = new Box(3, 6, 9);

double vol;

// получение объема первого параллелепипеда

vol = mybox1. volume();

System. out. println(" Объем равен " + vol);

// получение объема второго параллелепипеда

vol = mybox2. volume();

System. out. println(" Объем равен " + vol);

}

}

Вывод этой программы имеет следующий вид:

Объем равен 3000. 0

Объем равен 162. 0

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

Box mybox1 = new Box(10, 20, 15);

, значения 10, 20 и 15 передаются конструктору Box() при создании объекта с помощью операции new. Таким образом, копии переменных width, height и depth будут содержать соответственно значения 10, 20 и 15.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...