Главная страница

Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74


Скачать 1.76 Mb.
НазваниеЛабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Дата12.03.2021
Размер1.76 Mb.
Формат файлаdoc
Имя файлаOOP_Lab_Rus.doc
ТипЛабораторная работа
#184105
страница10 из 31
1   ...   6   7   8   9   10   11   12   13   ...   31

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


При создании экземпляров весьма утомительно инициализировать все переменные в классе. Даже, когда вы добавляете функции для организации удобств, подобные setDimo, было бы проще и быстрее делать всю установку во время первоначального создания объекта. Поскольку требования инициализации являются достаточно общими, 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 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 будут иметь один и тот же объем. Предложение printin() внутри Box() приводится только ради иллюстрации. Большинство функций конструктора ничего не будет отображать. Они просто инициализируют объект.

Прежде чем двигаться дальше, давайте повторно рассмотрим операцию new. Как вы знаете, при распределении (в памяти) объекта, нужно использовать следующую общую форму:
Class-var = new classname();
Теперь вы можете понять, почему необходимы круглые скобки после имени класса. Фактически выполняется вызов конструктора класса. Таким образом, правая часть операции присваивания в строке
Box myboxl = new Box();
есть вызов конструктора Box(). Если вы явно конструктор класса не определяете, то Java создает для этого класса конструктор по умолчанию (default constructor). Вот почему предшествующая строка программы работала в более ранних версиях Box, где конструктор не был определен. Умалчиваемый конструктор автоматически инициализирует все переменные экземпляра нулями. Такой конструктор часто достаточен для простых классов, но не для более сложных. Как только в классе определяется собственный конструктор, умалчиваемый больше не используется.

4.7.1 Параметризованные конструкторы


Когда конструктор 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 myboxl = new Box(10, 20, 15);

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

double vol;

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

vol = myboxl.volume();

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

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

vol = mybox2.volume ();

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

}

}
Вывод этой программы:
Объем равен 3000.0

Объем равен 162.0
Не трудно обнаружить, что каждый объект инициализирован так, как определено в параметрах его конструктора. Например, в следующей строке
Box myboxl = new Box(10, 20, 15);
значения 10, 20 и 15 передаются конструктору Bох(), когда new создает объект. Таким Образом, копии переменных width, height и depth объекта myboxl будут содержать значения 10, 20 и 15, соответственно.
1   ...   6   7   8   9   10   11   12   13   ...   31


написать администратору сайта