我们知道在 Java 中 Object 是所有类的基类。==
可以比较基本类型的值是否相等,而当比较对象时, ==
比较的是对象的引用。
Object 类的 equals()
方法的功能和 ==
比较对象一样,都是比较的对象的引用。像 String 类重写了该方法,所以使得 String 类的 equals()
和 ==
不同,可以比较 String 对象的内容是否相同。
这里需要编写一个 Value 类,并在类中重写 equals()
方法,使之能够实现比较 Value 对象的内容。
请根据目标完成 Value 类的代码。
Value 类描述:
- 该类包含两个成员变量:
int i
和String s
- 通过构造方法(有参构造方法)为全部成员变量赋值
- 重写的
equals()
方法返回值和参数为:public boolean equals(Object o)
目标
- 可以比较 Value 对象的内容。
- 可以和其他类的对象进行比较。
- 可以和 null 对象进行比较。
public class Value {
private int i;
private String s;
public Value(int i, String s) {
this.i = i;
this.s = s;
}
public boolean equals(Object otherObject) {
if (otherObject == null) // 检测otherObject是否为null
return false;
if (otherObject == this) //检测this与otherObject是否引用同一个对象
return true;
if (!(otherObject instanceof Value)) {//比较this与otherObject是否属于同一个类 ,
return false; //如果equals的语义在每个子类中有所改变,就使用getClass检测
}
if (this.getClass() != otherObject.getClass()) //如果所有的子类都拥有统一的语义,就使用instanceof检测
return false;
final Value temp = (Value) otherObject; //将otherObject转换为相应的类类型变量
//现在开始对所有需要比较的域进行比较 。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则就返回flase.
if (this.i == temp.i && this.s.equals(temp.s))
return true;
else
return false;
}
}
1)显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量
2)检测 this与otherObject是否引用同一个对象 :if(this == otherObject) return true;
3) 检测otherObject是否为 null ,如果为null,返回false.if(otherObject == null) return false;
4) 比较this与otherObject是否属于
同一个类
如果equals的语义在每个子类中有所改变,就使用getClass检测 :if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测 :if(!(otherObject instanceof ClassName)) return false;
如果equals的语义在每个子类中有所改变,就使用getClass检测 :if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测 :if(!(otherObject instanceof ClassName)) return false;
5) 将otherObject转换为相应的类类型变量:ClassName other = (ClassName) otherObject;
6) 现在开始对所有需要比较的 域进行比较 。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则就返回flase.
如果在子类中重新定义equals,就要在其中包含调用super.equals(other)