Конспект 3. Конспект 3. ООП. Общие сведения о конструкторах
Скачать 44.67 Kb.
|
Общие сведения о конструкторахКонструктор – это схожая c методом структура, назначение которой состоит в создании экземпляра класса. Характеристики конструктора:Имя конструктора должно совпадать с именем класса (по договоренности, первая буква — заглавная, обычно имя существительное); Конструктор имеется в любом классе. Даже если вы его не написали, компилятор Java сам создаст конструктор по умолчанию (default constructor), который будет пустым и не делает ничего, кроме вызова конструктора суперкласса. Конструктор похож на метод, но не является методом, он даже не считается членом класса. Поэтому его нельзя наследовать или переопределить в подклассе; Конструкторы не наследуются; Конструкторов может быть несколько в классе. В этом случае конструкторы называют перегруженными; Если в классе не описан конструктор, компилятор автоматически добавляет в код конструктор без параметров; Конструктор не имеет возвращаемого типа, им не может быть даже тип void , если возвращается тип void , то это уже не конструктор а метод, несмотря на совпадение с именем класса.В конструкторе допускается оператор return , но только пустой, без всякого возвращаемого значения;В конструкторе допускается применение модификаторов доступа, можно задать один из модификаторов: public , protected , private или без модификатора.Конструктор не может иметь модификаторов abstract , final , native , static или synchronized ;Ключевое слово this cсылается на другой конструктор в этом же классе. Если используется, то обращение должно к нему быть первой строкой конструктора;Ключевое слово super вызывает конструктор родительского класса. Если используется, должно обращение к нему быть первой строкой конструктора;Если конструктор не делает вызов конструктора super класса-предка (с аргументами или без аргументов), компилятор автоматически добавляет код вызова конструктора класса-предка без аргументов;Создание объекта и конструкторыПри создании объекта последовательно выполняются следующие действия: Ищется класс объекта среди уже используемых в программе классов. Если его нет, то он ищется во всех доступных программе каталогах и библиотеках. После обнаружения класса в каталоге или библиотеке выполняется создание, и инициализация статических полей класса. Т.е. для каждого класса статические поля инициализируются только один раз. Выделяется память под объект. Выполняется инициализация полей класса. Отрабатывает конструктор класса. Формируется ссылка на созданный и инициализированный объект. Эта ссылка и является значением выражения, создающего объект. Объект может быть создан и с помощью вызова метода newInstance() класса java.lang.Class . В этом случае используется конструктор без списка параметров.Аргументы переменной длины чаще всего задействованы в последующих манипуляциях с инициализациями переменных. Отсутствие некоторых из ожидаемых аргументов конструктора или метода удобно заменять значениями по умолчанию. Аргумент переменной длины есть массив, и обрабатывается как массив. Передача параметров в конструкторВ языках программирования существует в основном два вида параметров:основные типы (примитивы); ссылки на объекты. Термин вызов по значению (call by value) означает, что конструктор получает значение, переданное ему вызывающим модулем. В противоположность этому, вызов по ссылке (call by reference) означает, что конструктор получает от вызывающего модуля адрес переменной. В языке Java используется только вызов по значению. По значению параметра и по значению ссылки параметра. Java не использует вызов по ссылке для объектов (хотя многие программисты и авторы некоторых книг это утверждают). Параметры при передаче объектов в Java осуществляются не по ссылке, а по значению ссылки на объекты ! Если бы в языке Java для передачи объектов в качестве параметров использовался вызов по ссылке, то конструктор поменял бы в этом примере местами name1 и name2 . На самом деле конструктор не поменяет местами объектные ссылки, хранящиеся в переменных name1 и name2 . Это говорит о том, что параметры конструктора инициализируются копиями этих ссылок. Затем конструктор меняет местами уже копии. По завершении работы конструктора переменные x и y уничтожаются, а исходные переменные name1 и name2 продолжают ссылаться на прежние объекты. В любом случае конструктор получает копии значений всех параметров. Конструктор не может делать со своими входными параметрами: конструктор не может менять значения входных параметров основных (примитивных) типов; конструктор не может изменять ссылки входных параметров; конструктор не может переназначать ссылки входных параметров на новые объекты. Конструктор может делать со своими входными параметрами: изменять состояние объекта, передаваемого в качестве входного параметра. Переопределение методов equals and hashCode https://github.com/qcha/JBook/blob/master/object/hashcode.md Метод еquals() используется для сравнения объектов, а hashCode - для генерации целочисленного кода объекта. Так как HashMap и HashTable в Java полагаются на методы equals() и hashCode() для сравнения своих key и values , то Java предлагает следующие правила для переопределения этих методов: Рефлексивность: Объект должен равняться себе самому. Симметричность: если a.equals(b) возвращает true , то b.equals(a) должен тоже вернуть true .Транзитивность: если a.equals(b) возвращает true и b.equals(c) тоже возвращает true , то c.equals(a) тоже должен возвращать true .Согласованность: повторный вызов метода equals() должен возвращать одно и тоже значение до тех пор, пока какое-либо значение свойств объекта не будет изменено. То есть, если два объекта равны в Java, то они будут равны пока их свойства остаются неизменными.Сравнение null : объект должны быть проверен на null . Если объект равен null , то метод должен вернуть false , а не NullPointerException . Например, a.equals(null) должен вернуть false .Порядок действий при создании класса и экземпляра класса: https://javarush.ru/groups/posts/2137-porjadok-deystviy-pri-sozdanii-obhhekta |