- •Наследование
- •Цели занятия
- •Понятие наследования
- •Понятие наследования
- •Понятие наследования
- •Расширенный класс. Конструкторы
- •Расширенный класс. Конструкторы
- •Расширенный класс. Конструкторы
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Порядок выполнения
- •Наследование и переопределение
- •Наследование и переопределение
- •Наследование и переопределение
- •Наследование и переопределение
- •Сокрытие полей. Доступ к
- •Сокрытие полей. Доступ к
- •Сокрытие полей. Доступ к
- •Возможность доступа и
- •Сокрытие статических членов
- •Служебное слово super
- •Служебное слово super
- •Служебное слово super
- •Совместимость
- •Совместимость
- •Совместимость
- •Явное преобразование типов
- •Явное преобразование типов
- •Проверка типа
- •Проверка типа
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы final
- •Методы и классы abstract
- •Методы и классы abstract
- •Методы и классы abstract
- •Класс Object
- •Методы класса Object
- •Методы класса Object
- •Методы класса Object
- •Методы класса Object
- •hashCode() и equals()
- •Клонирование объектов
- •Клонирование объектов
- •Клонирование объектов
- •Литература
Методы и классы abstract
41• Объявления подобных классов снабжают модификатором abstract, тем же признаком помечают и методы класса, в объявлении которого отсутствует блок тела
•Если необходимо создать класс, в котором все методы должны быть абстрактными, возможно, имеет смысл воспользоваться объявлением интерфейса
•Во многих случаях код, относящийся к сфере компетенции самого базового абстрактного класса, - это хороший претендент на приобретение статуса final, гарантирующего, что контракт класса не будет нарушен
•Любой класс, содержащий методы abstract, сам
должен быть обозначен как abstract
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Методы и классы abstract
42• Абстрактный метод должен быть переопределён в любом производном классе, если только тот не помечен как abstract
•В любом производном классе позволено переопределять конкретные методы базового класса, помечая их признаком abstract
•Объекты абстрактного класса нельзя создавать, поскольку заведомо известно, что какие-то его методы, которые могут быть вызваны прикладной программой, не реализованы
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Класс Object
43• Класс Object находится на вершине иерархии классов
Java
•Object явно или косвенно наследуется всеми классами, поэтому переменная типа Object способна указывать на объект любого типа, будь то экземпляр какого-либо класса или массив
•Любой переменной типа Object нельзя непосредственно присваивать значения простых типов (таких как int, boolean и т.п.), но эти ограничения легко обойти, «запаковав» значения в объекты соответствующих классов-оболочек (Integer, Boolean и др.), которые будут описаны далее
•В составе класса Object определена целая группа методов, которые наследуются всеми производными классами
•Эти методы можно условно разделить на две категории – прикладные методы и методы, обеспечивающие поддержку многопоточных вычислений
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Методы класса Object
44 • public boolean equals(Object obj)
•Проверяет, равны ли текущий объект и объект, на который указывает ссылка obj, переданная в качестве параметра, и возвращает значение true, если факт равенства установлен, и false – в противном случае
•Если необходимо проверить, указывают ли две ссылки на один и тот же объект, следует применять операторы == или !=
•Метод equals сопоставляет содержимое объектов
•В исходной реализации метода equals, предусмотренной в классе Object, предполагается, что объект равен только самому
себе, т.е.удовлетворяет условию this ==obj
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Методы класса Object
45 • public int hashCode()
•Возвращает значение хеш-кода текущего объекта
– числа, используемого для быстрого сравнения
объектов
•Каждый объект обладает собственным хеш-кодом, который находит применение в хеш-таблицах
•В реализации по умолчанию предусмотрен возврат значения, которое, как правило, различно для разных объектов
•Значение кода используется в процессе сохранения объекта в одной из хеш-коллекций
•Если объект не изменял свое состояние, то значение хэш-кода не должно изменяться
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Методы класса Object
46 • protected Object clone() throws
CloneNotSupportedException
•Возвращает клон текущего объекта
•Клон – это новый объект, являющийся копией текущего
•public final Class getClass()
•Возвращает объект типа Class, который представляет информацию о классе текущего объекта на этапе выполнения программы
•protected void finalize() throws Throwable
•Позволяет выполнить необходимые операции очистки состояния объекта до того момента, когда объект будет уничтожен в процессе сборки мусора
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Методы класса Object
47 • public String toString()
•Возвращает строковое представление объекта
•Метод toString() вызывается неявно, когда ссылка на объект употребляется в качестве операнда в контексте выражений конкатенации строк с помощью оператора +
•Версия метода toString(), реализованная в классе Object, по умолчанию возвращает строку, содержащую наименование класса, которому принадлежит текущий объект, символ @ и шестнадцатеричное представление хеш-кода объекта
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
hashCode() и equals()
48 • Оба метода, hashCode() и equals(), должны быть переопределены, если необходимо придать понятию равенства объектов иной смысл, отличный от того, который предлагается классом Object
•По умолчанию считается, что любые два различных объекта «не равны», т.е. метод equals() возвращает значение false, и их хеш- коды, как правило, различны
•Если версия метода equals(), реализованная в некоем классе, допускает «равенство» двух различных объектов, их хеш-коды, возвращаемые соответствующими вариантами метода hashCode(), также должны быть равны
•Если хэш-коды объектов одинаковы, то это еще не значит, что объекты эквивалентны
•Механизм хеширования тесно связан с методом equals(), возвращающим true, если в хеш-таблице найден ключ с заданным значением
•Изменение реализации в классе метода equals() влечет за собой изменение реализации метода hashCode()
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
|
Клонирование объектов |
49 • |
Результатом клонирования является копия объекта |
• |
Массивы поддерживают операцию клонирования: |
|
int[] arrayCopy = (int []) array.clone(); |
•В классе Object метод clone() является защищенным
•Метод clone() реализуется в конкретном классе
•Никто не гарантирует того, что результатом его выполнения будет копия объекта, и даже того, что новый объект будет того же класса
•Однако существует ряд соглашений, регламентирующих
реализацию метода clone():
Класс должен реализовывать интерфейс-маркер (пустой
интерфейс) Cloneable. Метод Object.clone() проверяет, реализован ли в классе, которому принадлежит
текущий объект, интерфейc Cloneable, и выбрасывает исключение типа CloneNotSupportedException, если
ответ отрицательный
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Клонирование объектов
50Класс должен переопределять метод clone(). Результатом работы метода Object.clone() является точная копия объекта, т.е. Object.clone()
обеспечивает простое клонирование - копирование всех полей исходного объекта в объект-копию и по завершении работы возвращается ссылка на созданный объект-копию. Метод вполне работоспособен во многих ситуациях, но при определённых обстоятельствах приходится его переопределять и дополнять
Результат клонирования должен быть получен вызовом super.clone()
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |