n Класс должен переопределять метод clone ()
n Класс должен реализовывать интерфейс-маркер Cloneable
n Результат клонирования должен быть получен вызовом super . clone ()
n Результатом работы метода Object . clone () является точная копия объекта
public Object clone() {
Object result = null;
try {
result = super.clone();
} catch (CloneNotSupportedException ex) {
throw new InternalError();
}
return result;
}
Особенности клонирования
int[][] a = {{1, 2, 3}, {4, 5,6}};
int[][] b = (int[][]) a.clone();
System.out.println(a[0][0]);
b[0][0] = 9;
System.out.println(a[0][0]);
n В результате клонирования скопировался только сам объект a, но не объект, на которые он ссылался
n При использовании результатов клонирования необходимо явное приведение типа
n Начиная с Java5 для массивов можно не выполнять явное приведение типа, но только для массивов
Глубокое клонирование объектов
n Простого клонирования может быть недостаточно, если объект содержит ссылки на агрегированные объекты
n В этом случае после процедуры простого клонирования необходимо создать и их копии тоже
public Object clone() {
Object result = null;
try {
result = super.clone();
result.a = (...) a.clone();
...
} catch (CloneNotSupportedException ex) { }
return result;
}
Вопрос 56 Сравнение объектов. Хэш-функции. Интерфейс Comparable. 9-11, 13 Лекция Базовые и утилитные классы API JAVA
Равенство объектов
n Простого сравнения ссылок недостаточно для сравнения содержимого объектов
n Для сравнения объектов по их содержимому применяется метод equals ( Object obj )
n В классе Object метод реализован таким образом, что возвращает true только при сравнении с самим объектом
n Конкретный класс должен переопределять метод equals (...)
Равенство объектов
n Метод equals (...) должен проверять эквивалентность объектов с точки зрения бизнес-логики
n Отношение, задаваемое на множестве объектов этим методом, должно обладать следующими свойствами:
l рефлективность
l симметричность
l транзитивность
l консистентность
l сравнение с null должно приводить к результату false
Хэш-код объекта
n Метод int hashCode () предназначен для получения
хэш-кода – числа, используемого для быстрого сравнения объектов
n Если объект не изменял свое состояние, то значение хэш-кода не должно изменяться
n Если два объекта эквивалентны (с точки зрения метода equals ()), то хэш-коды объектов должны быть одинаковыми
n Если хэш-коды объектов одинаковы, то это еще не значит, что объекты эквивалентны
n Изменение реализации в классе метода equals () влечет за собой изменение реализации метода hashCode ()
Интерфейс Comparable
n Реализация интерфейса означает введение отношения порядка на множестве объектов класса
n Метод compareTo()
l a.compareTo(b) < 0 a < b
l a.compareTo(b) > 0 a > b
l a.compareTo(b) = 0 a = b
n Настоятельно рекомендуется согласовывать работу методов compareTo () и equals ()
Вопрос 57 Классы-обертки примитивных типов.14-17 Лекция Базовые и утилитные классы API JAVA
Классы-обертки примитивных типов
n Значения примитивных типов не могут быть непосредственно использованы в контексте, где требуется ссылка
n Ссылочное представление значений примитивных типов является основной задачей т.н. классов-оберток
n Экземпляр такого класса хранит внутри значение примитивного типа и предоставляет доступ к этому значению
Классы-обертки примитивных типов
n Boolean
n Byte
n Character
n Double
n Float
n Integer
n Long
n Number
n Short
n Void
Наполнение классов-оберток
n Константы типов Integer . MAX _ VALUE, Double . NaN
n Конструкторы: по значению и строке Float ( float value ), Float ( String s )
n Методы получения значения Boolean . booleanValue (), Float . floatValue ()
n Методы преобразования типов Integer . parseInt ( String s ), Float . byteValue ()
n Методы проверки состояния и вида значения compareTo (...), Double . isInfinite ()
n Специальные методы, обусловленные спецификой типа Double . longBitsToDouble (...), Integer . toHexString ()
Дата: 2019-07-30, просмотров: 226.