Бесплатный курс по Java: от основ до продвинутого уровня
Метод Equals в Java. Его переопределение
Следующий метод Object – это equals.
Возвращает boolean значение.
equalsпо умолчанию проверяет только то, ссылаются ли две ссылки на один и тот же объект.
Если нам нужно проверить не только это, а является ли содержимое одного объекта одинаковым с другим объектом, то его нужно переопределять.
Переопределение Equals
Пример программы:
mport java.util.*;
class MyClass implements Cloneable {
int myA;
SomeClass myB;
MyClass(int myA, SomeClass myB){
this.myA = myA;
this.myB = myB;
}
// Переопределим equals чтоб он сравнивал не только то
// ссылаются ли ссылки на один и тот же объект
@Override
// Как уже говорили все классы наследуют от Object
// поэтому можно сделать так – equals(Object obj)
// И теперь в equals параметром можно передавать
// объекты любого типа – MyClass или SomeClass.
public boolean equals(Object obj) {
System.out.println(“Equals is called:” + this + “:” + obj);
//проверка ссылки
if (this == obj)
return true;
//проверка на пуст ли передаваемый объект
if (obj == null)
return false;
//getClass возвращает название класса
//переданного сюда параметром.
//Проверка объектов на принадлежность одному классу
if (getClass() != obj.getClass())
return false;
//сравнение полей
MyClass other = (MyClass) obj;
if (myA != other.myA)
return false;
//для ссылочных полей сравнение по “!=” не подходит
//нужно использовать equals и конечно в классах этих
//ссылочных полей тоже должен быть определен
//equals. в классе SomeClass ниже можно увидеть
//пример такого equals.
//Теперь мы его используем с строке кода ниже
if (!myB.equals(other.myB))
return false;
return true;
}
@Override
public String toString(){
return “MyClass{” + “myA=” + myA + “, myB=” + myB + ‘}’;
}
@Override
public MyClass clone()
throws CloneNotSupportedException{
Object obj = super.clone();
MyClass myClass = (MyClass)obj;
return myClass;
}
}
class SomeClass implements Cloneable {
int someVar;
SomeClass(int someVar){
this.someVar = someVar;
}
// Тоже переопределяем equals
@Override
public boolean equals(Object obj){
System.out.println(“Equals is called:”
+ this + ” : ” + obj);
// проверка ссылки
if (this == obj)
return true;
// проверка на пуст ли передаваемый объект
if (obj == null)
return false;
// Проверяем объекты на принадлежность одному классу
if (getClass() != obj.getClass())
return false;
// сравнение полей
SomeClass other = (SomeClass) obj;
if (someVar != other.someVar)
return false;
return true;
}
@Override
public SomeClass clone()
throws CloneNotSupportedException{
Object obj = super.clone();
SomeClass someclass = (SomeClass)obj;
return someclass;
}
@Override
public String toString(){
return “SomeClass{” + “someVar=” + someVar + ‘}’;
}
}
public class EqualsLesson {
public static void main(String[] args)
throws CloneNotSupportedException{
SomeClass someClass = new SomeClass(10);
MyClass myClass = new MyClass(10, someClass);
SomeClass someClass1 = new SomeClass(10);
MyClass myClass1 = new MyClass(10, someClass1);
System.out.println(myClass.equals(myClass1));
// В консоли можно увидеть что equals включит true.
// Это значит что myClass полностью
// равен по значениям myClass1
// Давайте для дополнительной проверки изменим
// какое-то поле myClass1
someClass1.someVar = 16;
// проверим
System.out.println(myClass.equals(myClass1));
// уже не полностью равны
}
}