Object类是Java中所有类的始祖,每个类都是由Object类扩展而来。
在Java中,只有基本类型不是对象,例如,数值(int等)、字符(char)和布尔类型(boolean)的值都不是对象。所有的数组类型都扩展了Object类。
1.equals方法
Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。然而为了防备两个变量均为null的情况,经常使用Objects.equals(a, b)。
Object.equals(a);
Objects.equals(a,b);
编写完美某个类的equals方法的建议:public boolean equals (Object otherObject)
-
显示参数命名为otherObject,稍后需要将它转换成一个叫做other的变量。
-
检测this与otherObject是否引用同一个对象。计算这个等式比一个个比较类中的域所付出的代价小得多。
if(this == otherObject) return true;
- 检测otherObject是否为null,如果为null,返回false。
if(otherObject == null) return false;
- 比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测:
if (getClass() != otherObject.getClass()) return false;
如果所有的子类都有统一的语义,就使用instanceof检测:
if(!(otherObject instanceof ClassName)) return false;
- 将otherObject转换为相应的类类型变量:
ClassName other = (ClassName) otherObject;
- 现在开始对所有需要比较的域进行比较。使用==比较基本类型域,使用Objects.equals(a, b)比较对象域(不使用本类的equals是因为防止对象域都为null)。对于数组类型的域,可以使用静态Arrays.equals方法检测相应的数组元素是否相等。如果所有的域都匹配,就返回true;否则返回false。
return field1 == other.field1 && Objects.equals(field2, other.field2) && ...;
如果在子类中重新定义equals,就要在其中包含调用super.equals(other)。
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public boolean equals(Object otherObject) {
if (this == otherObject) return true;
if (otherObject == null) return false;
if (getClass() != otherObject.getClass()) return false;
Employee other = (Employee) otherObject;
return Objects.equals(name, other.name) && salary == other.salary
&& Objects.equals(hireDay, other.hireDay);
}
}
public class Manager extends Employee {
private double bonus;
public boolean equals(Object otherObject) {
if (!super.equals(otherObject)) return false;
Manager other = (Manager) otherObject;
return bonus == other.bonus;
}
}
网友评论