The equals()
method of java.lang.Object
acts the same as the ==
operator; that is, it tests
for object identity rather than object equality. The implicit
contract of the equals()
method, however, is that it
tests for equality rather than identity. Thus most classes will
override equals()
with a version that does field by
field comparisons before deciding whether to return true or false.
To elaborate, an object created by a clone()
method
(that is a copy of the object) should pass the
equals()
test if neither the original nor the clone has
changed since the clone was created. However the clone will fail to
be ==
to the original object.
For example, here is an equals()
method you could
use for the Car
class. Two cars are equal if and only
if their license plates are equal, and that's what this method
tests for.
public boolean equals(Object o) {
if (o instanceof Car) {
Car c = (Car) o;
if (this.licensePlate.equals(c.licensePlate)) return true;
}
return false;
}
This example is particularly interesting because it demonstrates
the impossibility of writing a useful generic equals()
method that tests equality for any object. It is not sufficient to
simply test for equality of all the fields of two objects. It is
entirely possible that some of the fields may not be relevant to
the test for equality as in this example where changing the speed
of a car does not change the actual car that's referred to.
Be careful to avoid this common mistake when writing
equals()
methods:
public boolean equals(Car c) {
if (o instanceof Car) {
Car c = (Car) o;
if (this.licensePlate.equals(c.licensePlate)) return true;
}
return false;
}
The equals()
method must allow tests against any
object of any class, not simply against other objects of the same
class (Car
in this example.)
You do not need to test whether o
is
null
. null
is never an instance of any class.
null instanceof Object
returns false
.