Автор: Widowmaker1984

Вопросы 30, 31, 33 (конструкторы)

"Дайте определение понятию «конструктор»."
"Чем отличаются конструкторы по-умолчанию, копирования и конструктор с параметрами?"
"Расскажите об особенностях класса с единственным закрытым (private) конструктором"


1. Конструктор - это специальный метод, который вызывается при создании нового объекта. Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса (включая регистр), а по синтаксису конструктор похож на метод без возвращаемого значения.

скрытый текст1.1. Конструктор похож на метод, но не является методом, он даже не считается членом класса. Поэтому его нельзя наследовать или переопределить в подклассе.

1.2. По сути конструктор нужен для автоматической инициализации переменных. Не всегда удобно инициализировать все переменные класса при создании его экземпляра. Иногда проще, чтобы какие-то значения были бы созданы по умолчанию при создании объекта.

1.3. В отличие от метода, конструктор никогда ничего не возвращает (даже void).
private int Cat(); // так выглядит метод по имени Cat
Cat(); // так выглядит конструктор класса Cat

1.3.1. Если возвращается тип void, это уже не конструктор а метод, несмотря на совпадение с именем класса.

1.3.2. В конструкторе допускается оператор return, но только пустой, без всякого возвращаемого значения;

1.3.3. В конструкторе допускается применение модификаторов доступа, можно задать один из модификаторов: public, protected, private или без модификатора. Конструктор не может иметь модификаторов abstract, final, native, static или synchronized;

2. Существуют два вида конструкторов - явные и неявные.

2.1. Конструктор имеется в любом классе. Если он не указан явно, компилятор Java сам создаст конструктор по умолчанию (default constructor), который будет без параметров, пустым и не делает ничего, кроме вызова конструктора суперкласса. Если вы сами создали конструктор, то конструктор по умолчанию использоваться не будет.


2.1.1. То есть public class Example {} эквивалентно написанию:

public class Example
{
Example()
{
super;
}
}

скрытый текст2.1.1.1. В данном случае явно класса предка не указано, а по умолчанию все классы Java наследуют класс Object поэтому вызывается его конструктор.

2.2. Подобно любому методу, у конструктора могут быть параметры. В параметрах конструктора передаются параметры для инициализации объекта.

2.2.1. Если в классе определен конструктор с параметрами, а перегруженного конструктора без параметров нет, то вызов конструктора без параметров является ошибкой.

2.2.1.1.Тем не менее, в Java, начиная с версии 1.5, можно использовать конструкторы с аргументами переменной длины. И если есть конструктор, имеющий аргумент переменной длины, то вызов конструктора по умолчанию (т.е. без параметров) ошибкой не будет. Не будет потому, что аргумент переменной длины может быть пустым.

2.3.Конструкторов может быть несколько в классе. В этом случае конструкторы называют перегруженными. Java различает перегруженные методы по числу, типам и последовательности типов входных параметров (но не по возвращаемому типу).

2.3.1. В случае, если в параметрах перегруженного конструктора используется примитив, который может быть сужен (например int < — double), то вызов метода со "суженным" значением возможен, несмотря на то, что метода, перегруженного с таким параметром нет.

2.4. Конструктор копирования — это конструктор, который принимает в качестве параметра объект класса с целью его клонирования.

3. При создании объекта последовательно выполняются следующие действия:
— Ищется класс объекта среди уже используемых в программе классов, во всех доступных программе каталогах и библиотеках.
— После обнаружения класса выполняется создание и инициализация его статических полей. Для каждого класса они инициализируются только один раз.
— Выделяется память под объект.
— Выполняется инициализация полей класса.
— Отрабатывает конструктор класса.
— Формируется ссылка на созданный и инициализированный объект. Эта ссылка и является значением выражения, создающего объект.

3.1. Объект может быть создан и с помощью вызова метода newInstance() класса java.lang.Class. В этом случае используется конструктор без списка параметров.

4. Конструкторы могут быть частыми (private). Есть три варианта их использования:
- чтобы предотвратить создание экземпляра за пределами класса (класс констант, класс статических методов);
- чтобы предотвратить расширение (если вы создаете только частный конструктор, ни один класс не может расширить ваш класс, потому что он не может вызвать конструктор super(). Это своего рода синоним для final);
- перегруженные конструкторы (В результате методов перегрузки и конструкторов некоторые могут быть частными и некоторыми публичными. Например, если в ваших конструкторах есть непубличный класс, вы можете создать публичный конструктор, который создает экземпляр данного класса, а затем передает его частному конструктору).

4.1. Например, иногда класс создаётся только для хранения каких-то статических полей и статических методов. Таким классам принято давать имена Utils, но это не обязательно. Такому классу не нужен конструктор, но если автор класса его не создал, система сама создаст конструктор по умолчанию. Такой конструктор не имеет смысла и может послужить источником ошибок. Чтобы предохраниться от подобной проблемы, нужно явно создать пустой конструктор и сделать его закрытым.

4.2. Если у класса есть только частный конструктор, невозможно создать объект класса за его пределами. Поэтому нельзя унаследоваться от такого класса. При попытке будет выдаваться ошибка: "There is no default constructor available in имяКласса". А при попытке создать объект этого класса: "ИмяКласса() has private access in ИмяКласса"

Комментарии


Лучшее   Правила сайта   Вход   Регистрация   Восстановление пароля

Материалы сайта предназначены для лиц старше 16 лет (16+)