Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

Интерфейсы:

Cloneable – должен быть реализован объектами, которые планируется клонировать с помощью средств JVM;

Comparable – позволяет упорядочивать (сортировать, сравнивать) объекты каждого класса, реализующего этот интерфейс.

Object

Класс Object является базовым для всех остальных классов. Он определяет методы, которые поддерживаются любым классом в Java.

Метод public final native Class getClass возвращает объект типа Class, соответствующий классу объекта. Этот метод уже рассматривался в лекции 4.

Метод public boolean equals(Object obj) определяет, являются ли объекты одинаковыми. Если оператор == проверяет равенство по ссылке (указывают на один и тот же объект), то метод equals – равенство по значению (состояния объектов одинаковы). Поскольку класс Object не содержит полей, реализация в нем этого метода такова, что значение true будет возвращено только в случае равенства по ссылке, то есть:

public boolean equals(Object obj) {

return (this == obj);

}

В классах-наследниках этот метод при необходимости может быть переопределен, чтобы поддержать расширенное состояние объекта (например, если добавилось поле, характеризующее состояние). Рассмотрим сравнение объектов-оберток целых чисел (класс Integer ). Оно должно по всей логике возвращать значение true, если равны значения int чисел, которые обернуты, даже если это два различных объекта.

Метод equals может быть переопределен любым способом (например, всегда возвращать false, или, наоборот, true ) – компилятор, конечно же, не будет проводить анализ реализации и давать рекомендации. Однако существуют соглашения, которые необходимо соблюдать, чтобы программа имела предсказуемое поведение, в том числе и с точки зрения других программистов:

* рефлексивность: для любой объектной ссылки x, отличной от null, вызов x.equals(x) возвращает true ;

* симметричность: для любых объектных ссылок x и y, вызов x.equals(y) возвращает true только в том случае, если вызов y.equals(x) возвращает true ;

* транзитивность: для любых объектных ссылок x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то вызов x.equals(z) должен вернуть true ;

* непротиворечивость: для любых объектных ссылок x и y многократные последовательные вызовы x.equals(y) возвращают одно и то же значение (либо всегда true, либо всегда false );

* для любой не равной null объектной ссылки x вызов x.equals(null) должен вернуть значение false.

Пример:

package demo.lang;

public class Rectangle {

public int sideA;

public int sideB;

public Rectangle(int x, int y) {

super;

sideA = x; sideB = y;

}

public boolean equals(Object obj) {

if(!(obj instanceof Rectangle))

return false;

Rectangle ref = (Rectangle)obj;

return (((this.sideA==ref.sideA)&&(this.sideB==ref.sideB))||

(this.sideA==ref.sideB)&&(this.sideB==ref.sideA));

}

public static void main(String[] args) {

Rectangle r1 = new Rectangle(10,20);

Rectangle r2 = new Rectangle(10,10);

Rectangle r3 = new Rectangle(20,10);

System.out.println("r1.equals(r1) == " + r1.equals(r1));

System.out.println("r1.equals(r2) == " + r1.equals(r2));

System.out.println("r1.equals(r3) == " + r1.equals(r3));

System.out.println("r2.equals(r3) == " + r2.equals(r3));

System.out.println("r1.equals(null) == " + r1.equals(null));

}

}

Пример 13.1.

Запуск этой программы, очевидно, приведет к выводу на экран следующего:

r1.equals(r1) == true

r1.equals(r2) == false

r1.equals(r3) == true

r2.equals(r3) == false

r1.equals(null) == false

Пример 13.2.

В этом примере метод equals у класса Rectangle был переопределен таким образом, чтобы прямоугольники были равны, если их можно наложить друг на друга (геометрическое равенство).

Большинство стандартных классов переопределяет этот метод, строго следуя всем соглашениям.

Метод public int hashCode возвращает хеш-код ( hash code ) для объекта. Хеш-код – это целое число, которое сопоставляется с данным объектом. Оно позволяет организовать хранение набора объектов с возможностью быстрой выборки (стандартная реализация такого механизма присутствует в Java и будет описана в следующей лекции).

Для этого метода также принят ряд соглашений, которым стоит следовать при переопределении:

* если два объекта идентичны, то есть вызов метода equals(Object) возвращает true, то вызов метода hashCode у каждого из этих двух объектов должен возвращать одно и то же значение;

* во время одного запуска программы для одного объекта при вызове метода hashCode должно возвращаться одно и то же значение, если между этими вызовами не были затронуты данные, используемые для проверки объектов на идентичность в методе equals. Это число не обязательно должно быть одним и тем же при повторном запуске той же программы, даже если все данные будут идентичны.

В классе Object этот метод реализован на уровне JVM. Сама виртуальная машина генерирует хеш-код, основываясь на расположении объекта в памяти. Это позволяет для различных объектов (неравенство по ссылке) получать различные хеш-коды.

Поделиться:
Популярные книги

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Лекарь Империи

Карелин Сергей Витальевич
1. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи

Фишер. По следу зверя. Настоящая история серийного убийцы

Рогоза Александр
Реальные истории
Документальная литература:
истории из жизни
биографии и мемуары
5.00
рейтинг книги
Фишер. По следу зверя. Настоящая история серийного убийцы

Казачий князь

Трофимов Ерофей
5. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Казачий князь

Как я строил магическую империю 13

Зубов Константин
13. Как я строил магическую империю
Фантастика:
постапокалипсис
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Как я строил магическую империю 13

Искатель 4

Шиленко Сергей
4. Валинор
Фантастика:
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Искатель 4

Моя простая курортная жизнь 7

Блум М.
7. Моя простая курортная жизнь
Фантастика:
дорама
гаремник
5.00
рейтинг книги
Моя простая курортная жизнь 7

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение