Get Adobe Flash player

Мы уже познакомились с понятием класса в Java. Мы определили, что класс является как бы шаблоном для создания объектов класса (экземпляров класса) и что класс состоит из полей и методов класса. Но мы еще не рассмотрели очень важную составляющую классов — конструкторы класса .
Конструктор класса — это специальный метод класса. Он вызывается при создании объекта класса. Конструкторы (в своем описании) отличаются от других методов класса тем, что их имя совпадает с именем класса. Кроме того, при описании любого метода класса, кроме конструктора, мы обязаны указать тип возвращаемого значения, а если метод не возвращает никакого значение, то мы должны вместо типа явно указать void. При описании конструктора тип возвращаемого значения вообще не указывается.
Разберем более подробно, что происходит при создании объекта класса.
• Ищется класс объекта среди уже используемых в программе классов. Если его нет, то он ищется во всех доступных программе каталогах и библиотеках. После обнаружения класса в каталоге или библиотеке выполняется создание и инициализация статических полей класса. Т.е. для каждого класса статические поля инициализируются только один раз.
• Выделяется память под объект.
• Выполняется инициализация полей класса.
• Отрабатывает конструктор класса.
Это не полная схема, а упрощенная.
Итак, что такое конструктор .
• 1. Это специальный метод класса.
• 2. Его имя совпадает с именем класса.
• 3. Конструктор не возвращает никакого значения.
• 4. Конструктор, как и любой другой метод, может иметь параметры.
• 5. Конструктор без параметров называется конструктором по умолчанию (default constructor).
• 6. В классе может быть несколько конструкторов. В этом случае они должны иметь разные наборы параметров.
• 7. Если в классе нет ни одного конструктора, то генерируется пустой конструктор по умолчанию. Если в классе есть хотя бы один конструктор, то конструктор по умолчанию не генерируется.
До сих пор в примерах мы использовали примерно следующий синтаксис создания объектов.
SomeClass obj = new SomeClass();
В данном случае создается объект и при его создании используется конструктор без параметров (конструктор по умолчанию). Но возможен и другой вариант.
SomeClass obj = new SomeClass(1, ‘a’);
Здесь при создании объекта вызывается конструктор с двумя параметрами. Т.е. в классе SomeClass должен быть описан конструктор, имеющий один арифметический параметр (например, int) и один символьный параметр.
Для того чтобы обе вышеприведенные строки были корректными, описание класса SomeClass должно выглядеть примерно так.
class SomeClass {
. . .
public SomeClass() { // это конструктор по умолчанию
. . .
}

SomeClass( int a, char c) { // это конструктор с двумя параметрами
. . .
}
. . .
}

Вызов одного конструктора из другого
В Java есть одна удобная возможность, позволяющая сократить суммарный объем кода конструкторов. Обычно все конструкторы класса имеют общую часть кода, поскольку они должны выполнять одинаковые действия, которые отличаются только некоторыми деталями. Можно вынести эту общую часть кода в отдельный метод и вызывать его из всех конструкторов. Но есть и другая возможность. В Java можно вызвать один конструктор из другого. Для этого используется ключевое слово this . Рассмотрим это на примере.
public class Point {
private double x, y;

public Point(double x, double y) {
this.x = x;
this.y = y;
}

public Point() {
this(0, 0); // вызов конструктора с двумя параметрами
}
. . .
}

В классе Point (точка) имеется два конструктора. Один, более общий, с двумя параметрами, предназначен для конструирования точки плоскости с заданными координатами. Другой, без параметров, строит точку с координатами (0, 0). В нем для экономии кода просто вызывается первый из конструкторов с параметрами (0, 0).
Есть одно ограничение на вызов одного конструктора из другого. Такой вызов должен быть первым оператором в вызывающем конструкторе.

public class Constructor {//начало класса
public Constructor() {
new Cat();
//System.out.println(«not less then»);
}

public static void main(String[] args) {
//new Constructor();
new Cat(2);
new Cat();}//конец main
}//конец класса

class Animal {//начало
private int size=24;

public int getSize(){
return size;
}

Animal(){
System.out.println(«I am first » + getSize());
//getSize();
}

Animal(int s){
size=s;
System.out.println(«Size is «+ size);
}

}//конец

class Cat extends Animal{//начало Cat

private int size=25;
private double x, y;

Cat (){
this(10);//переопределяет конструктор Animal(), меняет значение size
//System.out.println(«I am second » + getSize() + » — » + size);
}

Cat (int size){

super(size);//передает в родительский конструктор Animal(int s) и меняет значение переменной size
System.out.println(«My size is » + size);
}

}// конец Cat