Виды конструкторов в Java
1. Что такое конструктор?
В языке 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 BoxExample3 {
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 BoxExample4 {
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
. Метод может быть переопределен в подклассе и исказить процесс инициализации объекта.
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.