Главная страница
Навигация по странице:

  • void

  • return

  • public

  • synchronized

  • super

  • newInstance()

  • name1

  • Переопределение методов equals and hashCode https://github.com/qcha/JBook/blob/master/object/hashcode.md

  • hashCode

  • equals()

  • Порядок действий при создании класса и экземпляра класса: https://javarush.ru/groups/posts/2137-porjadok-deystviy-pri-sozdanii-obhhekta

  • Конспект 3. Конспект 3. ООП. Общие сведения о конструкторах


    Скачать 44.67 Kb.
    НазваниеОбщие сведения о конструкторах
    АнкорКонспект 3. ООП
    Дата19.10.2022
    Размер44.67 Kb.
    Формат файлаodt
    Имя файлаКонспект 3. ООП.odt
    ТипДокументы
    #741583

    Общие сведения о конструкторах


    Конструкторэто схожая c методом структура, назначение которой состоит в создании экземпляра класса. Характеристики конструктора:

    • Имя конструктора должно совпадать с именем класса (по договоренности, первая буква — заглавная, обычно имя существительное);

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

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

    • Конструкторы не наследуются;

    • Конструкторов может быть несколько в классе. В этом случае конструкторы называют перегруженными;

    • Если в классе не описан конструктор, компилятор автоматически добавляет в код конструктор без параметров;

    • Конструктор не имеет возвращаемого типа, им не может быть даже тип void, если возвращается тип void, то это уже не конструктор а метод, несмотря на совпадение с именем класса.

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

    • В конструкторе допускается применение модификаторов доступа, можно задать один из модификаторов: publicprotectedprivate или без модификатора.

    • Конструктор не может иметь модификаторов abstractfinalnativestatic или 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 предлагает следующие правила для переопределения этих методов:

    1. Рефлексивность: Объект должен равняться себе самому.

    2. Симметричность: если a.equals(b) возвращает true, то b.equals(a) должен тоже вернуть true.

    3. Транзитивность: если a.equals(b) возвращает true и b.equals(c) тоже возвращает true, то c.equals(a) тоже должен возвращать true.

    4. Согласованность: повторный вызов метода equals() должен возвращать одно и тоже значение до тех пор, пока какое-либо значение свойств объекта не будет изменено. То есть, если два объекта равны в Java, то они будут равны пока их свойства остаются неизменными.

    5. Сравнение null: объект должны быть проверен на null. Если объект равен null, то метод должен вернуть false, а не NullPointerException. Например, a.equals(null) должен вернуть false.

    Порядок действий при создании класса и экземпляра класса:

    https://javarush.ru/groups/posts/2137-porjadok-deystviy-pri-sozdanii-obhhekta


    написать администратору сайта