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

Вспомним, как создаются объекты в Java. Основной способ создания экземпляров классов – это применение оператора new с конструктором класса, например:

Student stud = new Student();

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

Ниже перечислены некоторые особенности конструктора:

- конструктор имеется в любом классе. Даже если он не был описан в классе, компилятор сам создаст конструктор по умолчанию без параметров;

- имя конструктора всегда совпадает с именем класса, в котором он описан;

- конструктор не может быть вызван иначе как оператором new и выполняется автоматически при создании экземпляра класса, но до начала использования создаваемого объекта;

- конструктор не возвращает никакого значения. В его описании не пишется даже служебное слово void.

В классе может быть описано несколько конструкторов. Поскольку у них одно и то же имя, совпадающее с именем класса, то они должны отличаться типом и/или количеством параметров.

Обратите внимание на особенность создания конструктора по умолчанию. Если конструктор не был создан в классе, то он создается автоматически. Однако если в классе программистом уже описан один или несколько конструкторов (с аргументами или без), то компилятор больше не будет создавать конструктор по умолчанию. Рассмотрим пример.

Создадим простой класс с несколькими конструкторами:

class My{

int i;

My(int a) {}//конструктор 1

My (double b) {} //конструктор 2

public static void main(String[] args){

My h = new My(); //Ошибка!

}}

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

Следующая запись верна – компилятор запустит первый конструктор с целочисленным параметром.

My h = new My(5); //Верно

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

class My{

int i;

My(int...a) {}//конструктор 1

My (double b) {} //конструктор 2

public static void main(String[] args){

My h = new My();

}}

Компиляция и запуск такой программы пройдут успешно.

Иногда для того, чтобы сослаться на текущий объект в методах и конструкторах используют ключевое слово this.

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

Рассмотрим несколько примеров применения this в конструкторах. В следующем классе MyClass имеются два конструктора с различными входными параметрами. В первом конструкторе выполняется вызов второго конструктора данного класса с использованием ключевого слова this:

class MyClass{

int a;

int b;

MyClass() {

this (10,5);}

MyClass(int a, int b) {

this. a=a;

this. b=b;}

public static void main(String[] args){

MyClass h = new MyClass();

System.out.printf("a+b=%3d",h.a+h.b);

}}

Результатом выполнения программы будет строка: a+b= 15.

В методе main() создается объект h с помощью конструктора без параметров, который в свою очередь вызывает конструктор с двумя целыми параметрами a и b, передавая для них аргументы 10 и 5 соответственно.

Во втором конструкторе ключевое слово this используется для получения доступа к переменным экземпляра a и b с такими же именами, что и у локальных переменных a и b. Без использования ключевого слова this формальные параметры в данном случае скрыли бы переменные экземпляра.

Рассмотрим еще один пример программы, в которой создается класс Rect, описывающий ширину и высоту прямоугольника и включающий в себя метод экземпляра аrea(), возвращающий площадь прямоугольника и метод класса perimeter(), вычисляющий периметр.

class Rect {

int width;

int height;

//параметризованный конструктор

Rect(int width, int height) {

this.width = width;

this.height = height;

}

// метод экземпляра

public int area() {

return width * height;

}

// метод класса

static int perimetr(Rect h) {

return 2*(h.width + h.height);

}

}

class UseRect {

public static void main(String[] args) {

Rect r = new Rect(4, 5);

System.out.printf("Площадь:%d%n", r.area());

System.out.printf("Периметр:%d",Rect.perimetr(r));

}

}

В этом варианте написания конструктора Rect() имена параметров совпадают с именами переменных экземпляра, а, следовательно, скрывают их. Но для “обнаружения” скрытых переменных служит ключевое слово this. Вторым интересным моментом в этом примере является иллюстрация использования метода класса. Второй из двух методов класса – perimetr() описан с ключевым словом static, что делает его методом класса. Такой метод не может быть вызван от конкретного объекта с помощью оператора точка (.), ему не передается указатель this на экземпляр, а само это ключевое слово не может быть использовано в его теле. Поэтому методу в качестве параметра следует явно передать ссылку на объект. Вызывается статический метод просто по имени. Так как в примере метод вызывается из другого класса, то его имя уточняется именем класса, в котором он описан: Rect.perimetr(r).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: