<< Chapter < Page | Chapter >> Page > |
Let us try to override the method
equals
in classes
BParticle
and
CParticle
; the method returns true if the all fields of the
two objects are equal.
b1
and
b2
of type
BParticle
and two unequal objects
c1
and
c2
of type
CParticle
.b1.equals(b2)
returns
true and
c1.equals(c2)
returns
false .b1.equals(c1)
returns
true : since
CParticle
is a subclass of
BParticle
, the variable
c1
is acceptable
as a parameter to the method
equals
declared in
BParticle
.
c1
is equal to
b1
, because we are only comparing
the first two fields inherited from
BParticle
and these are equal.
Exercise Explain what happens if you try to evaluate
c1.equals(b1)
.
Program: Inheritance07C.java
// Learning Object Inheritance07C
// equality (robust overriding)class Particle {
int position;
Particle(int p) { position = p;
}
void newPosition(int delta) {
position = position + delta; }
}
class BParticle extends Particle { int charge;
BParticle(int p, int c) {
super(p); charge = c;
}}
class CParticle extends BParticle {
boolean strange;
CParticle(int p, int c, boolean s) { super(p, c);
strange = s; }
void newPosition(int delta) {
if (strange) position = position * charge;
}
public boolean equals(Object obj) { if (obj == null) return false;
if (!(obj instanceof CParticle)) return false; CParticle c = (CParticle) obj;
return this.position == c.position && this.charge == c.charge && this.strange == c.strange;
}}
class Inheritance07C {
public static void main(/*String[] args*/) {
BParticle b1 = new BParticle(20, 2); CParticle c1 = new CParticle(20, 2, false);
CParticle c2 = new CParticle(20, 2, true); CParticle c3 = new CParticle(20, 2, false);
boolean eqc1null = c1.equals(null); boolean eqc1b1 = c1.equals(b1);
boolean eqc1c2 = c1.equals(c2); boolean eqc1c3 = c1.equals(c3);
}}
It would be unusual for two objects to be considered equal if they
are of different types, even if one type is a subclass of another.In fact,
public boolean equals(CParticle c)
does not override the method
equals
in
BParticle
,
because an overriding method must have the
same signature as the overridden
method.
The method
equals
is declared in the root class
Object
as:
public boolean equals(Object obj)
and this is the method that must be overridden.
This program shows the correct technique:
null
.Object
to the type.Trace the execution of the program:
b1
of type
BParticle
and three objects
c1
,
c2
and
c3
of type
CParticle
.c1
to
null
or
b1
returns
false .CParticle
:
c1.equals(c2)
returns
false and
c1.equals(c3)
returns
true .Notification Switch
Would you like to follow the 'Learning objects for java (with jeliot)' conversation and receive update notifications?