Поведение по умолчанию «равно» изменяется при добавлении члена / установщика? - PullRequest
2 голосов
/ 01 мая 2011

У меня вопрос по поводу метода Java "равно".

Я создал класс с именем Person:

public class Person {

}

И я сравниваю две ссылки на Person следующим образом.

Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.equals(p2));     //returns false

Если я добавлю любую переменную экземпляра и установщикметод для установки переменной экземпляра, затем метод «равно» возвращает true.

Кто-нибудь может объяснить это поведение?

Ответы [ 2 ]

14 голосов
/ 01 мая 2011

Если вы не переопределяете Object.equals (Object), то реализация по умолчанию использует для сравнения идентификатор объекта.(т. е. equals возвращает true, только если объекты являются одним и тем же объектом в памяти).

Соответствующий JavaDoc: Object.equals

Выдержка:

Метод equals для класса Object реализует максимально различающее возможное отношение эквивалентности для объектов;то есть для любых ненулевых ссылочных значений x и y этот метод возвращает true, если и только если x и y ссылаются на один и тот же объект (x == y имеет значение true).

Object a = new Object();
Object b = new Object();
System.out.println(a.equals(b)); // Prints 'false'
b = a;
System.out.println(a.equals(b)); // Prints 'true'

Как я уже упоминал в одном из моих комментариев, добавление методов или полей не должно влиять на реализацию метода equals по умолчанию, что-то еще должно происходить.

0 голосов
/ 01 мая 2011

p1 и p2 - это две разные ссылки, поэтому. Он вернет false, если у вас нет собственного equals метода. Не имеет значения, есть ли у вас переменная экземпляра или нет.

...