1) Конструктор является статическим методом.
При создании первого объекта типа Dog или при первом вызове статического метода или обращения к статическому полю класса Dog интерпретатор Java находит класс Dog.class. Поиск в каталогах CLASSPATH.
2) Загружается Dog.class (с созданием объекта Class) и производится инициализация статических элементов (только один раз, при первой загрузке).
3) Создается новый объект new Dog () - выделяется область памяти для объекта Dog в Heap.
4) Выделенная область памяти заполняется нулями.
5) Инициализируются поля.
6) Выполняются конструкторы.
Блоки инициализации
Блок статической инициализации
public class Spoon {
static int i;
static {i=47;} } // исполняется один раз при создании первого объекта или обращения к статическим членам
Блок инициализации (выполняется перед конструктором)
public class Mugs {
Mug mug1;
Mug mug2;
{mug1=new Mug (1);
mug2 = new Mug (2); }
Выводы (особенности конструктора):
1) Конструктор имеется в любом классе. Если он не описан, компилятор сам создаст default constructor (он не делает ничего, кроме вызова конструктора суперкласса- super()). Если есть хоть 1 конструктор – default-конструктор компилятор не сделает.
|
|
2) Конструктор выполняется автоматически при создании экземпляра класса, после выделения памяти и инициализации полей.
3) Конструктор не возвращает значения. Может иметь модификаторы: -public, -private, -protected или не иметь (пакетный доступ).
4) Конструктор (фактически – статический метод). Но методом не считается, его нельзя наследовать или переопределить, но можно перегрузить.
5) Тело конструктора может начинаться с:
super(…) - вызов конструктора суперкласса;
this (…) - вызов другого конструктора.
Если super (…) - нет, то вначале все равно выполняется super(); по умолчанию (хотя бы для Object). То есть если класс будет базовым, желательно написать для него конструктор по умолчанию.
Можно писать new Dog().voice();(приоритет у new выше,чем у .)