Конструктор в 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 BoxDemo3 {
    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 BoxDemo4 {
    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. Метод может быть переопределен в подклассе и исказить процесс инициализации объекта.

Read also:
Comments