День 111

Смотрите, в Java есть два способа сравнения обьектов: с помощью оператора == и с помощью метода equals(). Оператор == отвечает на вопрос указывают ли две переменные на один и тот же обьект, а метод equals() отвечает на вопрос являются ли два обьекта одинаковыми "по сути".

Вы должны понимать что происходит когда исполняется такой код:

Kreis kreis3 = new Kreis (100, 100, 50);

А просходят две вещи. Сначала выполняется new Kreis (100, 100, 50) и в памяти компьютера создается обьект Kreis с определенными параметрами. Затем переменная kreis3 "связывается" с эти обьектом, т.е. она начинает на него указывать.

Далее, когда выполняется

Kreis kreis4 = kreis3;

то еще одна переменная, kreis4, начинает указывать на тот же обьект что и переменная kreis3. Обратите внимание, у вас две переменные, но один обьект в памяти, на который они обе указывают.

Теперь если вы сравните эти переменные с помощью ==, т.е;

kreis3 == kreis4

то получите true, потому что эти переменные действительно указывают на один и тот же обьект.

Но если вы выполните код

Kreis kreis1 = new Kreis (100, 100, 50);
Kreis kreis2 = new Kreis (100, 100, 50);

то здесь у вас будет два разных обьекта, хотя и с одинаковыми параметрами, поэтому

kreis1 == kreis2

вернет вам false.

Метод equals используется когда мы хотим сравнивать обьекты "по сути", допустим у нас два разных обьекта, но мы хотим получить true если у них одинаковые параметры и false когда они не одинаковые. Тогда мы можем написать метод equals в нашем классе таким образом, чтобы он сравнивал параметры обьектов и возвращал соответствующий результат. Но что будет если мы не напишем такой метод в нашем классе? Тогда, при вызове equals() будет выполнена унаследованная версия этого метода из класса Object. Возможно вы уже знаете, что все обьекты в Java наследуют от Object. Один из методов Object это equals(), но все что он делает это использует оператор ==, у него нет другого выбора, ведь он не знает о параметрах вашего обьекта типа Kreis. Таким образом, если в вашем классе Kreis нет своего метода equals(), то при вызове этого метода будет использована унаследованная версия которая полностью эквивалентна использованию оператора ==.

А вот класс String имеет свой equals(), который сравнивает строки "по сути" и возвращает true если они состоят из одинаковых символов.

Ответы

Большое спасибо, Алекс. Получается, я могу создать сотню объёктов с одинаковыми параметрами, но для equals() это будут разные объекты, если созданы каждый сам по себе, и одинаковыми, если я буду каждый раз определять их через какой-то, ранее созданный. И принцип его работы в String действительно отличается, что меня и сбило с толку больше всего.

Alex писал(а):

Возможно вы уже знаете, что все обьекты в Java наследуют от Object. Один из методов Object это equals()

Да, это как раз и была тема, equals() и toString, вторую ещё переписали в своей программе, а первую только немного опробовали.

Есть что сказать?

Чтобы поддержать автора или поспорить с ним, войдите или зарегистрируйтесь — это быстро.

ВойтиЗарегистрироваться